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

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

將空對象轉換為整數

將空對象轉換為整數

慕雪6442864 2023-08-04 16:27:49
我試圖理解下面的代碼。第 2 行輸出null,而第 3 行拋出NullPointerException。我缺少什么?理論上它應該有效。public static void main(String []args){  1  Object[] obj = {null};   2  System.out.println((Integer)obj[0]);  //Output null  3  Integer n = obj[0] == null ? (Integer)obj[0] : 1; //NullPointerException  4  System.out.println(n); }
查看完整描述

2 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

根據JLS中定義的規則,三元條件運算符的類型

null???(Integer)obj[0]?:?1;

int, 不是Integer.

因此,當該表達式的結果為 時(Integer)obj[0],將Integer拆箱為int,得到NullPointerException。

參見JLS 15.25。條件運算符 ??:,表 15.25-A。:

由于第二個操作數是Integer,第三個操作數是int,因此條件表達式類型是int


查看完整回答
反對 回復 2023-08-04
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

這里的關鍵概念是二進制數字提升。

當您為運算符提供不同類型的操作數時,必須將這些操作數轉換為彼此兼容。此轉換的條件運算符的規則相當復雜;但當操作數具有不同類型且可轉換為數字時,將應用二進制數字提升。

在提供一個裝箱操作數和一個原始操作數的情況下,二進制數字提升的效果是嘗試對裝箱操作數進行拆箱,而不是對原始操作數進行裝箱。

您可以使用其他多操作數運算符觀察二進制數字提升,例如+

System.out.println(1?+?(Integer)?null);?//?NullPointerException!

使用條件運算符,如果顯式對 1 進行裝箱,則不會得到 NPE,因為操作數的類型不不同:

Integer?n?=?obj[0]?==?null???(Integer)obj[0]?:?Integer.valueOf(1);


查看完整回答
反對 回復 2023-08-04
  • 2 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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