2013-04-26 39 views
15

這是我認爲的java純粹主義者之一。我最近有一個方法來執行String值的自定義分析到布爾值的問題。一個很簡單的任務,但由於某些原因如下方法是空的情況下拋出一個NullPointerException ...布爾型的NullPointerException

static Boolean parseBoolean(String s) 
{ 
    return ("1".equals(s) ? true : ("0".equals(s) ? false : null)); 
} 

該方法的返回類型布爾爲什麼或如何能一個NullPointerException異常被拋出? 通過調試,似乎在嵌套的內聯條件語句計算爲null並將外部內聯條件返回null的時候拋出異常,但我再次無法解釋原因。

最後,我放棄了,並重寫了方法如下,符合市場預期,其工作原理:

static Boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 
    if ("0".equals(s)) return false; 

    return null; 
} 

下面的代碼是兩者之間的半路上,也按預期工作:

static Boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 

    return "0".equals(s) ? false : null; 
} 
+2

+1對於一個不錯的「益智遊戲」 – NilsH 2013-04-26 10:35:34

+0

@NilsH感謝+1和解決方案! – Robin 2014-01-27 11:25:35

回答

13

這也適用於:

static Boolean parseBoolean(String s) 
{ 
    return ("1".equals(s) ? Boolean.TRUE : ("0".equals(s) ? Boolean.FALSE : null)); 
} 

所以,你得到的NPE是由於自動裝箱,因爲三元運算符使用boolean導致表達式的結果作爲一個boolean被處理的原因。 null的解除導致NPE。

+1

+1做得好。不是一個原來認爲看代碼的東西。 – 2013-04-26 09:58:46

+0

好答案@Nils - 那個滑的小惡魔!我沒有想過使用布爾常量。 – Robin 2013-08-05 11:07:01

8

我建議?不要返回Boolean,返回boolean並拋出一個異常:

static boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 
    if ("0".equals(s)) return false; 

    throw new IllegalArgumentException(s + " is not a boolean value."); 
} 

採用類似的做法都有助於避免不小心引用空Boolean對象。請參閱excellent answer from NilsH以查看原始方法拋出異常的原因。

+1

我同意。以後快速遇到NPE會更好。如果需要「三態」解決方案,布爾有它的用處。 – NilsH 2013-04-26 10:27:12

+0

這是一個三態條件,所以我真的不應該爲期望值拋出異常! 反正也不是異常處理更貴? – Robin 2013-08-05 11:02:43

2

有趣但沒有答案告訴你爲什麼這種情況發生在第一位。

這與三元表達有關。

編譯器將null解釋爲對Boolean的空引用,對Boolean應用自動裝箱/拆箱規則(對null)=>在運行時會出現NullPointerException。

+2

我認爲你必須重新閱讀答案;) – NilsH 2013-04-26 10:04:52

+1

@NilsH可能在寫作時錯過了你的這一部分。 :)從我+1。 – Eugene 2013-04-26 10:05:52