2013-08-07 86 views
7

我有一些代碼,使這個結構內檢測未檢查異常拋出:局部變量可能尚未初始化 - 方法

public void method() { 
    Object o; 
    try { 
     o = new Object(); 
    } catch (Exception e) { 
     //Processing, several lines 
     throw new Error(); //Our own unchecked exception 
    } 
    doSomething(o); 
} 

我有,我有相同的代碼在catch不少方法塊,所以我想提取它到一個方法,以便我可以保存一些行。我的問題是,如果我這樣做,我會得到一個編譯器錯誤「 本地變量o可能沒有被初始化」。

public void method() { 
    Object o; 
    try { 
     o = new Object(); 
    } catch (Exception e) { 
     handleError(); 
    } 
    //doSomething(o); compiler error 
} 


private void handleError() throws Error { 
    //Processing, several lines 
    throw new Error(); 
} 

有什麼解決方法嗎?

+0

注:實例變量不需要初始化,但局部變量的方法(內部變量)需要初始化 – gjman2

回答

5

需要初始化局部變量它們被用作以下

public void method() { 
    Object o=null; 
    try { 
     o = new Object(); 
    } catch (Exception e) { 
     handleError(); 
    } 
    doSomething(o); 
} 

之前,直到您使用的未初始化

+1

如果變量由於某種原因必須是最終的,那麼它們並不適合。在這種情況下,我贊成由@ gyro-gearless提供的解決方案。 – Eusebius

3

由於o是獲得try塊中初始化,初始化o可能會引發異常,JAVA認爲doSomething(o)語句可能會達到不o被初始化。所以java想要o被初始化,因爲new Object()會拋出異常。

所以初始化onull會解決這個問題

public void method() { 
    Object o = null; 
    try { 
     o = new Object(); //--> If new Object() throws exception then o remains uninitialized 
    } catch (Exception e) { 
     handleError(); 
    } 
    if(o != null) 
     doSomething(o); 
} 
+0

我會考慮這是一種反模式,因爲它會通過不必要的if-not-null檢查來混淆代碼! try/catch機制可以避免這種模式:如果某些所需對象的創建失敗,則該函數應該通過異常。 –

+0

是的,我同意。我的意圖是提供解決方案,並解釋爲什麼我們得到錯誤 – sanbhat

3

初始化你的對象:Object o = null;,但提防NullPointerException那時你給它的方法調用可能拋出。

2

只要把doSomething(o)try { }局部變量您將無法獲得編譯失敗塊:

public void method() { 
    Object o; 
    try { 
     o = new Object(); 
     doSomething(o); 
    } catch (Exception e) { 
     handleError(); 
    } 

} 

如果創建對象失敗,您可能不想執行doSomething()!

0

實例變量是對象類型,所以你應該初始化值「空」

public void method() { 
Object o=null; 
try { 
    o = new Object(); 
} catch (Exception e) { 
    handleError(); 
} 
doSomething(o); 
}