2010-03-19 34 views
7

看看下面的代碼片段:`返回值'從Java構造函數異常?

A a = null 
try { 
    a = new A(); 
} finally { 
    a.foo(); // What happens at this point? 
} 

假設A的構造函數拋出一個運行時異常。在標記的那一行,我總是保證會得到一個NullPointerException,或者foo()會在一個半結構實例上被調用?

回答

12

try塊內的代碼包含兩個不同的操作:

  1. 創建一個新的A實例。
  2. 將新實例分配給名爲a的變量。

如果在步驟1中引發異常,則不會執行步驟2。
因此,你將永遠得到一個NullPointerException

+1

因此將其寫成'final A a = new A();嘗試{...}終於{a.foo(); }'。如果它需要捕獲一個異常,請添加**另一個**嘗試塊。 – 2010-03-19 00:35:57

+0

或者如果您不確定finally代碼塊中'a'引用的狀態,只需將'a.foo()'用'(如果!= null) – 2010-03-19 01:19:30

6

如果new A()引發異常,您將總是得到一個NullPointerException,因爲a的賦值不會發生。

1

我想你總是會在標記處得到一個NPE。 作業從來沒有機會發生。

1

如果在構造函數中發生異常,調用new A(),那時該對象的值爲空值。所以a.foo() 給出了空指針異常。您可以給出條件if(a!= null){ a.foo(); }