繁体   English   中英

Java实例成员初始化引发异常

[英]Java instance member initialization throws an exception

让我们说我有以下课程

public class A {
   private B b;
}

现在有一个工厂用于创建B的实例,但是creator方法会引发异常

public class BCreatorFactory {
   public static createB() throws SomeException {
      // DO the intialization
      // ...
      return b;
}

如果我在声明行中设置Ab,那么我将无法处理异常

public class A {
   private B b = BCreatorFactory.createB() // BAD -> no way of dealing with the exception
}

如果我在构造函数中设置Ab,那么我要么有一个“半熟”实例,要么再次抛出异常并强制调用代码处理未正确初始化的实例

public class A {
   private B b;

   public A() {
      try {
         b = BCreatorFactory.createB();
      }
      catch (SomeException se) {
      // Do something, perhaps try to recover ? <- IMO also BAD
      }
   }
}

要么

public class A {
   private B b;

   public A() throws SomeException { // BAD
      b = BCreatorFactory.createB();
   }
}

我可以尝试延迟init B的实例:

public class A {
   private B b;

   public B getB() throws SomeException {
      if (b == null) {
          b = BCreatorFactory.createB(); // BAD -> not thread safe -> can result in redundant createB() invocations
      }
      return b;
   }
}

但是我能想到使其成为线程安全的唯一方法是通过已知在Java的JVM中被破坏的 Double-Checked Locking

public class A {
   private B b;

   public B getB() throws SomeException {
       if (b == null) {
            synchronized(this) {
                if (b == null) {
                    b = BCreatorFactory.createB(); // BAD -> not really thread safe -> broken
                }
            }
       }
       return b;
   }
}

亲爱的读者,那该怎么办?

换句话说, 初始化包含引用创建对象的对象实例的对象实例的最佳解决方案是什么?

这怎么了

public class A {
   private B b;

   public A() throws SomeException { // BAD -- *no it's not*
      b = BCreatorFactory.createB();
   }
}

构造函数抛出异常没有错。

构造函数抛出异常没有错。 Java框架中的许多类都会从构造函数中引发异常。 只要您有一种自动处理和解决情况的方法,也可以在构造函数中捕获异常。 Java中检查异常的重点是,您不能仅忽略错误条件,而必须在某处进行处理。

我抛出异常并强制调用代码处理未正确初始化的实例

调用代码不必处理初始化不正确的实例,它将自动转到catch块,在该块中,您应该对异常进行一些处理,无论是引发,记录,失败还是其他情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM