奇怪的Java行為。三元運算符
該行為在JLS-條件運算符中指定:
如果第二和第三個操作數中的一個是原始類型T的,并且其他的類型是施加裝箱轉換(§5.1.7)到T的結果,則 。
強調我的。因此,在第二種情況下:
Float f = true ? testFloat : 0f;
由于第三個操作數是基本類型(T),因此表達式的類型將是浮點類型- T。因此, 取消 當前引用的 testFloat的 裝箱 將導致NPE 。null``float __
對于第一種情況,相關部分是最后一部分:
否則,第二和第三操作數分別為S1和S2類型。令T1為對S1進行裝箱轉換所產生的類型,而T2為對S2進行裝箱轉換所產生的類型。條件表達式的類型是將捕獲轉換(§5.1.10)應用于lub(T1,T2)(§15.12.2.7)的結果。
因此,根據此:
null type - S1float - S2null type - T1 (Boxing null type gives null type)Float - T2 (float Boxed to Float)
然后條件表達式的類型變為- Float。沒有null需要的拆箱,因此沒有NPE。
解決方法為什么此代碼有效?
Float testFloat = null;Float f = true ? null : 0f;
為什么這會引發異常?
Float testFloat = null;Float f = true ? testFloat : 0f;
但是最奇怪的是,該代碼也可以成功運行,沒有任何異常:
Float testFloat = null;Float f = testFloat;
看來Java的三元運算符會改變行為。有人可以解釋為什么嗎?
相關文章:
1. redis與mysql一致性問題2. macos - mac下docker如何設置代理3. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?4. css - 求推薦適用于vue2的框架 像bootstrap這種類型的5. mysql關聯更新不成功6. android - coordinatorLayout嵌套recyclerview7. javascript - Web微信聊天輸入框解決方案8. javascript - 微信支付:H5調起支付API,直接說支付失敗9. 想練支付寶對接和微信支付對接開發(Java),好像個人不可以,怎么弄個企業的10. javascript - [多圖預警]reactjs點擊某表格編輯內容,跳轉傳值this.context.router.params.id時id報錯未定義
