2 回答

TA貢獻(xiàn)1863條經(jīng)驗 獲得超2個贊
根據(jù)JLS中定義的規(guī)則,三元條件運算符的類型
null???(Integer)obj[0]?:?1;
是int
, 不是Integer
.
因此,當(dāng)該表達(dá)式的結(jié)果為 時(Integer)obj[0]
,將Integer
拆箱為int
,得到NullPointerException
。
參見JLS 15.25。條件運算符 ??:,表 15.25-A。:
由于第二個操作數(shù)是Integer
,第三個操作數(shù)是int
,因此條件表達(dá)式類型是int
。

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