為什么會拋出 NullPointerExceptionpublic static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b);}public static Boolean returnsNull() { return null;}雖然這不是public static void main(String[] args) throws Exception { Boolean b = true ? null : false; System.out.println(b); // null}?解決方案是通過替換false方式Boolean.FALSE來避免null被取消裝箱-這boolean是不可能的。但這不是問題。問題是為什么?JLS中是否有任何引用可以證實這種行為,尤其是第二種情況?
3 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
該行:
Boolean b = true ? returnsNull() : false;
在內部轉換為:
Boolean b = true ? returnsNull().booleanValue() : false;
執行拆箱;因此:null.booleanValue()將產生NPE
這是使用自動裝箱時的主要陷阱之一。此行為確實記錄在5.1.8 JLS中
編輯:我相信取消裝箱是由于第三個運算符是布爾類型,例如(添加了隱式強制轉換):
Boolean b = (Boolean) true ? true : false;

德瑪西亞99
TA貢獻1770條經驗 獲得超3個贊
根據Java語言規范的第15.25節:
如果第二個操作數和第三個操作數之一為布爾型,而另一個的類型為布爾型,則條件表達式的類型為布爾型。
所以,第一個例子試圖調用Boolean.booleanValue(),以轉化Boolean到boolean按第一條規則。
在第二種情況下,第一個操作數為空類型,而第二個操作符不是引用類型,因此將應用自動裝箱轉換:
否則,第二和第三操作數分別為S1和S2類型。令T1為對S1進行裝箱轉換所產生的類型,而T2為對S2進行裝箱轉換所產生的類型。條件表達式的類型是將捕獲轉換(§5.1.10)應用于lub(T1,T2)(§15.12.2.7)的結果。
添加回答
舉報
0/150
提交
取消