2012-04-09 63 views
0

我有最後一個成員的數據最終的變量初始化:確保當一個構造函數拋出異常

public final Foo foo; 
在構造

foo被初始化如下:

foo = new Foo(); 

現在,不幸的是,Foo的構造函數可能會拋出一個異常:

try { 
    foo = new Foo(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

但是現在編譯器公司mplains foo可能未被初始化,如果Foo的構造函數拋出異常,則爲true。但是,如果我把foo = null放在收集括號內,它會抱怨foo可能已經被初始化。

Foo是我無法修改的第三方庫。

那麼,處理這個問題的最優雅的方式是什麼?

+0

即使沒有try/catch塊,我也沒有收到編譯器的投訴。你是否讓你的類的構造函數拋出了Foo引發的異常? – 2012-04-09 19:49:48

回答

7
foo = createFoo(); 

... 


private static Foo createFoo() { 
    try { 
     return new Foo(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

我做出是否有意義繼續施工的外部對象的,如果內部對象的構造失敗無可奉告......

+0

哈。沒想到這一點。謝謝! – garbagecollector 2012-04-09 19:34:15

0
final Foo foo ; 
Foo foo_temp = null ; 
try { 
    foo_temp = new Foo(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    foo = foo_temp ; 
} 
+0

在發生異常的情況下,是不是foo_temp在這裏未初始化? – 2012-04-09 19:43:47

+0

@TonyEnnis我認爲你是對的。 – emory 2012-04-09 19:46:23

+0

嘿,至少有人有足夠的關心閱讀你的代碼;-) – 2012-04-09 19:51:06

0

也許我不理解,但我不要錯誤。請注意,ConTest的構造函數拋出了Foo引發的異常。這對我來說是最優雅的(回答你的問題。)如果Foo未能初始化,是不是有什麼錯誤?

ConTest.java:

public class ConTest { 
     public final Foo foo; 
     public ConTest() throws Exception { 
      foo = new Foo(3); 
     } 
    } 

Foo.java:

public class Foo { 
     public Foo(int i) throws Exception { 
      if (i < 0) throw new Exception("yah"); 
     } 
    } 

,這一切編譯罰款。

+0

如果ConTest的構造函數拋出一個異常,那麼是的,'foo'有些錯誤。但這並不意味着ConTest必須重新拋出該異常。即使'foo'初始化失敗,ConTest仍然可以正常工作。 – garbagecollector 2012-04-09 20:39:06

+0

這對我來說很奇怪。你會在代碼中使用很多_if(foo!= null ...)_嗎? – 2012-04-09 20:47:15

+0

不是很多,但我不負責整個源代碼,所以我必須遵守現有合同。 – garbagecollector 2012-04-09 21:03:16

相關問題