成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

奇怪的Java行為。三元運算符

瀏覽:129日期:2024-04-24 11:24:56
如何解決奇怪的Java行為。三元運算符?

該行為在JLS-條件運算符中指定:

如果第二和第三個操作數(shù)中的一個是原始類型T的,并且其他的類型是施加裝箱轉(zhuǎn)換(§5.1.7)到T的結(jié)果,則 。

強調(diào)我的。因此,在第二種情況下:

Float f = true ? testFloat : 0f;

由于第三個操作數(shù)是基本類型(T),因此表達式的類型將是浮點類型- T。因此, 取消 當(dāng)前引用的 testFloat的 裝箱 將導(dǎo)致NPE 。null``float __

對于第一種情況,相關(guān)部分是最后一部分:

否則,第二和第三操作數(shù)分別為S1和S2類型。令T1為對S1進行裝箱轉(zhuǎn)換所產(chǎn)生的類型,而T2為對S2進行裝箱轉(zhuǎn)換所產(chǎn)生的類型。條件表達式的類型是將捕獲轉(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)

然后條件表達式的類型變?yōu)? Float。沒有null需要的拆箱,因此沒有NPE。

解決方法

為什么此代碼有效?

Float testFloat = null;Float f = true ? null : 0f;

為什么這會引發(fā)異常?

Float testFloat = null;Float f = true ? testFloat : 0f;

但是最奇怪的是,該代碼也可以成功運行,沒有任何異常:

Float testFloat = null;Float f = testFloat;

看來Java的三元運算符會改變行為。有人可以解釋為什么嗎?

標簽: java
相關(guān)文章: