2013-01-22 32 views
3

我最近才知道,使用trycatch塊爲NullPointerException s是一個不好的做法。替代捕捉NullPointerException

如果是這樣,那麼我有以下問題:

  1. 爲什麼這是一個不好的做法?
  2. 捕捉NullPointerException有什麼選擇?
+2

不好的做法完全不 –

+4

一般捉住他們來講,NPE的是不正確編寫的代碼的標誌。我認爲僅僅因爲這個原因才能捕捉到NPE是一種代碼味道。 – Perception

回答

0

如果可能,應該避免有任何異常,因爲生成它們並通過應用程序發送它們在資源上是很昂貴的。

空點好辦,只需要檢查,如果事情是空或不是

8

當你周圍添加一段代碼在try/catch塊,你希望扔在特定情況下一個NPE,你可能無意中忘記了該代碼使用的另一個對象,該對象可能也是空的並導致一個。然後,當您添加代碼以對catch代碼塊中的預期NPE作出反應時,代碼也將在意外的NPE上執行。這將輸出一個誤導性的錯誤信息,最壞的情況下會導致完全意外的程序行爲。

一個例子:

try { 
    ThingamabobFactory.getInstance().createThingamabob(ThingamabobFactory.getDefaults()).thingamabobify(); 
} catch(NullPointerException e) { 
     // so... which of the above method calls did return null? 
     // ...or was the NPE even thrown INSIDE one of these methods?? 
} 

因此,當你想到一個對象會在某些情況下空,要處理這種情況下,通過檢查if (object == null),以避免任何誤報這樣做。

+0

'if(object == null)'看起來像一個骯髒的黑客。 –

+0

@RomanC所以你會建議如何找出一個對象爲null的方法? – Philipp

+0

如果你想簡單地檢查對象是否有空值,那麼是真的,如果你想消除在正常情況下NPE不應該發生的代碼中發生這種黑客的異常,那麼就是錯誤的。你也應該檢查可能的NPE的代碼,這是微不足道的。 –

4

的大問題,抓住拋出NullPointerException知道該怎麼辦纔好,因爲它可以有很多可能的原因。

您可以更確保你知道什麼是空,爲什麼如果你專門測試空。例如,假設代碼塊包含對在特定環境下返回null的方法的調用,並且您希望在某種情況下執行某些操作。如果立即測試方法結果,那麼知道 null是由於導致該方法返回null的情況造成的。

在另一方面,如果你在包裝一個try-catch塊,趕上NullPointerException異常,也許是方法返回null,但你不能肯定是發生了什麼事。 try塊中可能有其他問題,導致異常。

0

你能避免直接使用處理過的拋出,或者您可以通過使用BCEL嘗試另一種方法。

-1

或者在音譯服務端包裝非法參數異常,或者只是處理可預測的空情況以處理模型或方法的前提條件,或者捕獲異常,在此catch中,if instance ...要寫入日誌或者更多。一般來說,永遠不會直接捕獲空值點異常,它是運行時異常,它具有邏輯: 如果您知道代碼中的空白處,則處理它。如果你不知道,在你抓到後,你做了什麼?你不是JVM,對吧?