亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

布爾值,條件運算符和自動裝箱

布爾值,條件運算符和自動裝箱

HUWWW 2019-10-08 15:17:53
為什么會拋出 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; 


查看完整回答
反對 回復 2019-10-08
?
德瑪西亞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)的結果。


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關注
  • 373 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號