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

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

為什么在Java中將Integer與int進行比較會拋出NullPointerException?

為什么在Java中將Integer與int進行比較會拋出NullPointerException?

繁星點點滴滴 2019-10-10 16:57:11
觀察這種情況令我非常困惑:Integer i = null;String str = null;if (i == null) {   //Nothing happens   ...                  }if (str == null) { //Nothing happens}if (i == 0) {  //NullPointerException   ...}if (str == "0") { //Nothing happens   ...}因此,我認(rèn)為裝箱操作首先執(zhí)行(即Java嘗試從中提取int值null),而比較操作的優(yōu)先級較低,這就是引發(fā)異常的原因。問題是:為什么要用Java這樣實現(xiàn)?為什么裝箱優(yōu)先于比較參考?或者為什么他們沒有null在裝箱前實施驗證?此刻,當(dāng)NullPointerException它與包裝的基元一起被拋出而與真實的對象類型沒有被拋出時,它看起來不一致。
查看完整描述

3 回答

?
人到中年有點甜

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

您的NPE示例與此代碼等效,這要歸功于自動裝箱:


if ( i.intValue( ) == 0 )


因此,如果NPE i為null。

查看完整回答
1 反對 回復(fù) 2019-10-10
?
躍然一笑

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

簡短答案

關(guān)鍵是:


== 兩個參考類型之間總是參考比較

通常,例如,使用Integer和String,您可以equals改用

== 引用類型和數(shù)字原始類型之間的始終是數(shù)字比較

引用類型將進行拆箱轉(zhuǎn)換

拆箱null總是拋出NullPointerException

盡管Java對Java有很多特殊處理String,但實際上它不是原始類型

上面的語句適用于任何給定的有效 Java代碼。有了這種理解,您呈現(xiàn)的代碼段中就不會出現(xiàn)任何不一致之處。


長答案

以下是相關(guān)的JLS部分:


JLS 15.21.3參考相等運算符==和!=

如果相等運算符的操作數(shù)均為引用類型或null類型,則該操作為對象相等。


這解釋了以下內(nèi)容:


Integer i = null;

String str = null;


if (i == null) {   // Nothing happens

}

if (str == null) { // Nothing happens

}

if (str == "0") {  // Nothing happens

}

這兩個操作數(shù)都是引用類型,這就是為什么==引用相等比較。


這也解釋了以下內(nèi)容:


System.out.println(new Integer(0) == new Integer(0)); // "false"

System.out.println("X" == "x".toUpperCase()); // "false"

為了==達(dá)到數(shù)值相等,至少一個操作數(shù)必須是數(shù)值類型:


JLS 15.21.1數(shù)值相等算子==和!=

如果相等運算符的操作數(shù)是兩個數(shù)字類型的,或一個是數(shù)字類型的,并且另一種是可轉(zhuǎn)換到數(shù)字類型,二進制數(shù)值提升時對操作數(shù)執(zhí)行。如果操作數(shù)的提升類型為int或long,則執(zhí)行整數(shù)相等性測試;否則,執(zhí)行整數(shù)相等性測試。如果提升的類型為float ordouble`,則執(zhí)行浮點相等性測試。


請注意,二進制數(shù)值升級執(zhí)行值集轉(zhuǎn)換和裝箱轉(zhuǎn)換。


這說明:


Integer i = null;


if (i == 0) {  //NullPointerException

}

這是摘自Effective Java 2nd Edition,第49條:首選基元而不是盒裝基元:


總之,只要有選擇,就優(yōu)先于框式基元使用基元?;绢愋透唵?,更快速。如果必須使用盒裝原語,請當(dāng)心!自動裝箱減少了使用裝箱原語的冗長程度,但沒有危險。當(dāng)您的程序?qū)蓚€裝箱的原語與==運算符進行比較時,它將進行身份比較,這幾乎肯定不是您想要的。當(dāng)您的程序進行涉及裝箱和拆箱原語的混合類型計算時,它會進行拆箱,而當(dāng)您的程序進行拆箱時,它可能會拋出NullPointerException。最后,當(dāng)您的程序?qū)⒃贾笛b箱時,可能會導(dǎo)致創(chuàng)建昂貴且不必要的對象。


在某些地方您別無選擇,只能使用盒裝基元,例如泛型,但是否則您應(yīng)該認(rèn)真考慮使用盒裝基元的決定是否合理。


查看完整回答
反對 回復(fù) 2019-10-10
?
BIG陽

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

Java的開發(fā)者可以將==運算符定義為直接對不同類型的操作數(shù)進行操作,在這種情況下,如果Integer I; int i;進行比較,則I==i;可能會問到“是否I持有Integer其值是i?的引用”這一問題,可以很容易地得到回答。即使I為null。不幸的是,Java不能直接檢查不同類型的操作數(shù)是否相等。而是檢查該語言是否允許將一個操作數(shù)的類型轉(zhuǎn)換為另一個操作數(shù)的類型,如果允許,則將轉(zhuǎn)換后的操作數(shù)與未轉(zhuǎn)換的操作數(shù)進行比較。這種行為意味著變量x,y以及z與一些類型的組合,它可能有x==yy==z,但x!=z[例如,x = 16777216f y = 16777216 z = 16777217]。這也意味著將比較I==i翻譯為“將I轉(zhuǎn)換為int,如果沒有拋出異常,則將其與進行比較i”。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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