奇怪的Java行為。三元運(yùn)算符
該行為在JLS-條件運(yùn)算符中指定:
如果第二和第三個操作數(shù)中的一個是原始類型T的,并且其他的類型是施加裝箱轉(zhuǎn)換(§5.1.7)到T的結(jié)果,則 。
強(qiáng)調(diào)我的。因此,在第二種情況下:
Float f = true ? testFloat : 0f;
由于第三個操作數(shù)是基本類型(T),因此表達(dá)式的類型將是浮點類型- T。因此, 取消 當(dāng)前引用的 testFloat的 裝箱 將導(dǎo)致NPE 。null``float __
對于第一種情況,相關(guān)部分是最后一部分:
否則,第二和第三操作數(shù)分別為S1和S2類型。令T1為對S1進(jìn)行裝箱轉(zhuǎn)換所產(chǎn)生的類型,而T2為對S2進(jìn)行裝箱轉(zhuǎn)換所產(chǎn)生的類型。條件表達(dá)式的類型是將捕獲轉(zhuǎn)換(§5.1.10)應(yīng)用于lub(T1,T2)(§15.12.2.7)的結(jié)果。
因此,根據(jù)此:
null type - S1float - S2null type - T1 (Boxing null type gives null type)Float - T2 (float Boxed to Float)
然后條件表達(dá)式的類型變?yōu)? Float。沒有null需要的拆箱,因此沒有NPE。
解決方法為什么此代碼有效?
Float testFloat = null;Float f = true ? null : 0f;
為什么這會引發(fā)異常?
Float testFloat = null;Float f = true ? testFloat : 0f;
但是最奇怪的是,該代碼也可以成功運(yùn)行,沒有任何異常:
Float testFloat = null;Float f = testFloat;
看來Java的三元運(yùn)算符會改變行為。有人可以解釋為什么嗎?
相關(guān)文章:
1. android - 美團(tuán)篩選處篩選條件停靠+條件點擊滑動到頂部。2. list - python 求助3. python3.x - python3.5使用pyinstaller打包報錯找不到libpython3.5mu.so.1.0等文件求解?4. python算法,如何優(yōu)雅的合并2個列表字典?5. python - def自定義函數(shù)的疑惑6. 請教: 關(guān)于 python 反斜杠轉(zhuǎn)義的疑問7. mysql優(yōu)化 - mysql like語句會導(dǎo)致全表掃描?8. javascript 如何下載一個excel文件 ?9. Python中, 仿照經(jīng)典代碼實現(xiàn)單例, 卻出現(xiàn)了不是單例的的狀態(tài), 代碼哪里出錯了 ?10. php由5.3升級到5.6后,登錄網(wǎng)站,返回的是php代碼,不是登錄界面,各位大神有知道的嗎?
