簡體   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