我試圖理解下面的代碼。第 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
。

Helenr
TA貢獻1780條經驗 獲得超4個贊
這里的關鍵概念是二進制數字提升。
當您為運算符提供不同類型的操作數時,必須將這些操作數轉換為彼此兼容。此轉換的條件運算符的規則相當復雜;但當操作數具有不同類型且可轉換為數字時,將應用二進制數字提升。
在提供一個裝箱操作數和一個原始操作數的情況下,二進制數字提升的效果是嘗試對裝箱操作數進行拆箱,而不是對原始操作數進行裝箱。
您可以使用其他多操作數運算符觀察二進制數字提升,例如+
:
System.out.println(1?+?(Integer)?null);?//?NullPointerException!
使用條件運算符,如果顯式對 1 進行裝箱,則不會得到 NPE,因為操作數的類型不不同:
Integer?n?=?obj[0]?==?null???(Integer)obj[0]?:?Integer.valueOf(1);
添加回答
舉報
0/150
提交
取消