第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

三元表達式可以在沒有編譯器錯誤的情況下產(chǎn)生空布爾值嗎?

三元表達式可以在沒有編譯器錯誤的情況下產(chǎn)生空布爾值嗎?

一只萌萌小番薯 2021-09-12 15:41:40
鑒于以下代碼:boolean c = true;boolean d = true;boolean b = c ? null : d;System.out.println(b);為什么編譯器不在這里抱怨?變量 b 是原始數(shù)據(jù)類型,null 不應(yīng)該產(chǎn)生諸如“類型不匹配:無法從 null 轉(zhuǎn)換為布爾值”之類的錯誤消息嗎?我最好的猜測是,正在進行一些自動裝箱?我在一個項目中看到了這段代碼,但我很想知道這背后的確切原因......EDIT1:正如下面提到的 Mena,這段代碼在運行時產(chǎn)生一個 NullPointer編輯 2:下面的形式也編譯沒有錯誤:boolean c = false;boolean d = true;boolean b = c ? null : d;System.out.println(b);編輯 3:嘗試使用編譯器級別 1.4 進行編譯時,這不會編譯,但會產(chǎn)生錯誤:Incompatible conditional operand types null and boolean.所以自動裝箱是有意義的,因為它是在 1.5 中引入的?
查看完整描述

3 回答

?
精慕HU

TA貢獻1845條經(jīng)驗 獲得超8個贊

RHS 上的表達式屬于類型Boolean,將在運行時自動拆箱;編譯時類型檢查不會受到影響。拆箱將導(dǎo)致運行時異常。


查看完整回答
反對 回復(fù) 2021-09-12
?
滄海一幻覺

TA貢獻1824條經(jīng)驗 獲得超5個贊

這不會編譯,因為我們不能將空值分配給原始類型的變量


boolean e = null;

這也沒有編譯,雖然有判斷,但是編譯器檢測到該值始終為null并且與前面的情況相同


boolean f = c ? null : null;

在這種情況下,由于編譯器不知道 b 的最終值,因此代碼可以編譯,但由于最終值為 null 而無法運行


boolean c = true;

boolean d = true;

boolean b = c ? null : d;


查看完整回答
反對 回復(fù) 2021-09-12
?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

三元表達式中的類型必須是相同的 type,所以我猜JLS 說在這種情況下這些類型是自動裝箱的(它會變成Boolean);考慮到檢查/優(yōu)化javac做的很少,這里沒有做。有趣的是,intellij 確實會抱怨,例如會拋出一個潛力 NullPointerException。


對我來說,這在某種程度上屬于同一類別:


String s = null;


if (true == true) {


}


if(s == null) {


}

等等......它們在編譯時對我們來說都是已知的,但對于編譯器來說卻不是。


有點不相關(guān),但三元運算符遠非if statement,Holger 曾經(jīng)向我展示了這個很棒的促銷示例:


boolean b = true;

Object result = b ? Integer.valueOf(42) : Long.valueOf(12);

System.out.println(result.getClass() + "  " + result); // class java.lang.Long  42


查看完整回答
反對 回復(fù) 2021-09-12
  • 3 回答
  • 0 關(guān)注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號