2011-05-26 128 views
0

考慮兩種情況case1和case2加上兩種方法method1和method2。說方法1解決case1和方法2解決case2。現在,我有一個可能以case1或case2結束的程序。在我的代碼中,無論發生什麼情況,我都會調用method1。但是,如果發生case2,method1會發出nullpointerexception。Java - 擺脫NullPointerException

我想要的是:我的代碼應該首先調用method1,如果發生異常,則調用method2。我該怎麼做?由於我沒有關於試穿的信息,所以我真的需要一些幫助!

+2

我認爲一些代碼比任何解釋都要好。 – khachik 2011-05-26 18:17:05

+0

我想你是對的。假設我有TreeNode parentNode,它將成爲平等的左手,右手將搜索(parent,this)或search2(parent,this)。然而,search和search2可能會返回null,這是我不想要的。現在,我應該如何實施? – 2011-05-26 18:31:10

+0

請編輯您的問題併發布一些代碼示例,而不僅僅是變量名稱和方法簽名。 – khachik 2011-05-26 18:33:24

回答

2

捕獲NullPointerException是一個糟糕的實踐 - 你可能沒有捕獲到你想捕獲的特殊異常。你有兩個選擇:

1)拋出自己的異常,後來抓住它:

public void method1(Case caze) throws MyException { 
    if (case.getType() == CaseType.CaseOne) { 
     // processing 
    } else { 
     throw new MyException("Wrong case type"); 
    } 
    } 

而且客戶端代碼:

try { 
    method1(caze); 
} catch (MyException e) { 
    // log the excpetion 
    method2(caze); 
} 

2)返回一個布爾標誌,表明該處理已成功完成。

請記住,分析數值比在您的情況下使用try-catch機制更好。我會爲你推薦變種#2。

3

你可以這樣做:

try { 
     method1(); 
    } 
    catch (Exception e) { 
     method2(); 
    } 

這就是說,它通常最好依賴於只對例外的例外條件。對於正常的控制流程,你可以使用一個if:

if (isCase2()) { 
     method2(); 
    } 
    else { 
     method1(); 
    } 
+0

正如@Vladimir發佈的,如果你打算用try/catch,最好從method1中拋出你自己的異常對象,而不是依賴NPE(由於其他問題,即使在案例1中也可能出現這種情況)。 – 2011-05-26 18:21:45

+0

同意。上面的第一個例子旨在從字面上滿足OP:「我的代碼應該首先調用method1,如果發生異常,則調用method2。」如果您可以事先區分case1和case2,那麼最好使用任何異常。 – 2011-05-26 18:28:38

+0

當然。在特殊情況下使用例外。這聽起來像是一個案件與另一個案件並不例外。 – 2011-05-26 18:43:40