大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 初學者學習需要接觸的Java三目運算符

初學者學習需要接觸的Java三目運算符

更新時間:2020-07-17 16:27:35 來源:動力節點 瀏覽2855次

Java三目運算符是我們經常在代碼中使用的,a=(b==null?0:1);這樣一行代碼可以代替一個if-else,可以使代碼變得清爽易讀。但是,三目運算符也是有一定的語言規范的。在運用不恰當的時候會導致意想不到的問題。

初學者學習需要接觸的Java三目運算符

一、三目運算符

對于條件表達式b?x:y,先計算條件b,然后進行判斷。如果b的值為true,計算x的值,運算結果為x的值;否則,計算y的值,運算結果為y的值。一個條件表達式從不會既計算x,又計算y。條件運算符是右結合的,也就是說,從右向左分組計算。例如,a?b:c?d:e將按a?b:(c?d:e)執行。

二、自動裝箱與自動拆箱

基本數據類型的自動裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能。

一般我們要創建一個類的對象實例的時候,我們會這樣:Class a=new Class(parameters);當我們創建一個Integer對象時,卻可以這樣:Integer i=100;(注意:和int i=100;是有區別的)

實際上,執行上面那句代碼的時候,系統為我們執行了:Integer i=Integer.valueOf(100);這里暫且不討論這個原理是怎么實現的(何時拆箱、何時裝箱),也略過普通數據類型和對象類型的區別。

我們可以理解為,當我們自己寫的代碼符合裝(拆)箱規范的時候,編譯器就會自動幫我們拆(裝)箱。那么,這種不被程序員控制的自動拆(裝)箱會不會存在什么問題呢?

三、問題回顧

首先,通過你已有的經驗看一下下面這段代碼。如果你得到的結果和后文分析的結果一致(并且你知道原理),那么請忽略本文。如果不一致,請跟我探索下去。

public?static?void?main(String[]?args)?{
?Map?map?=?new?HashMap<>();
?Boolean?b?=?map?!=?null???map.get("test")?:?false;
?System.out.println(b);
}

以上這段代碼,是我們在不注意的情況下有可能經常會寫的一類代碼(在很多時候我們都愛使用三目運算符)。

一般情況下,我們會認為以上代碼Boolean b的最終得到的值應該是null。因為map.get("test")的值是null,而b又是一個對象,所以得到結果會是null。

但是,以上代碼會拋出NPE:

Exception in thread"main"java.lang.NullPointerException

首先可以明確的是,既然報了空指針,那么一定是有些地方調用了一個null的對象的某些方法。在這短短的兩行代碼中,看上去只有一處方法調用map.get("test"),但是我們也都是知道,map已經事先初始化過了,不會是Null,那么到底是哪里有空指針呢。

我們接下來反編譯一下該代碼。看看我們寫的代碼在經過編譯器處理之后變成了什么樣。反編譯后代碼如下:

public?static?void?main(String?args[]){
?Map?map?=?new?HashMap();
?Boolean?b?=?Boolean.valueOf(map?==?null???false?:?((Boolean)map.get("test")).booleanValue());
?System.out.println(b);
}

看完這段反編譯之后的代碼之后,經過分析我們大概可以知道問題出在哪里。((Boolean)hashmap.get("test")).booleanValue()的執行過程及結果如下:

hashmap.get("test")->null;
(Boolean)null->null;
null.booleanValue()->報錯

好,問題終于定位到了。很明顯,上面源代碼中的map.get("test")在被編譯成了

(Boolean)map.get("test").booleanValue(),這是一種自動拆箱的操作。

那么,為什么這里會發生自動拆箱呢?這個問題又如何解決呢?

四、原理分析

通過查看反編譯之后的代碼,我們準確的定位到了問題,分析之后我們可以得出這樣的結論:NPE的原因應該是三目運算符和自動拆箱導致了空指針異常。

那么,這段代碼為什么會自動拆箱呢?這其實是三目運算符的語法規范。參見jls-15.25,摘要如下:

If the second and third operands have the same type(which may be the null type),then that is the type of the conditional expression.
If one of the second and third operands is of primitive type T,and the type of the other is the result of applying boxing conversion(§5.1.7)to T,then the type of the conditional expression is T.
If one of the second and third operands is of the null type and the type of the other is a reference type,then the type of the conditional expression is that reference type.

簡單的來說就是:當第二,第三位操作數分別為基本類型和對象時,其中的對象就會拆箱為基本類型進行操作。

所以,結果就是:由于使用了三目運算符,并且第二、第三位操作數分別是基本類型和對象。所以對對象進行拆箱操作,由于該對象為null,所以在拆箱過程中調用null.booleanValue()的時候就報了NPE。

五、問題解決

如果代碼這么寫,就不會報錯:

Map?map?=?new?HashMap();
Boolean?b?=?(map!=null???map.get("test")?:?Boolean.FALSE);

就是保證了三目運算符的第二第三位操作數都為對象類型。這樣就不會發生自動拆箱操作,以上代碼得到的b的結果為null。

初學者學習需要接觸的Java三目運算符

以上就是動力節點java培訓機構的小編針對“初學者學習需要接觸的Java三目運算符”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 狠狠色丁香婷婷综合欧美 | 91亚洲免费视频 | 欧美成人免费观看的 | 成人免费xxx色视频 成人免费播放视频777777 | 国产精品伦视频观看免费 | 2021国内精品久久久久影院 | 中文字幕日韩精品一区口 | 九九热这里有精品 | 老司机午夜免费福利 | 欧美一区二区久久精品 | 国产精品国产亚洲精品看不卡 | 欧美一区二区三区在线播放 | 一级黄色毛片子 | 玖玖在线播放 | 久久99精品国产99久久 | 99热久久免费精品首页 | 亚洲毛片网站 | 久久夜色撩人精品国产 | 国内在线视频 | 亚洲国产高清美女在线观看 | 中文在线免费不卡视频 | 999国产精品999久久久久久 | 国产精品区一区二区免费 | 成人欧美在线 | 免费看一级黄色毛片 | 我要看免费一级毛片 | 国产九九在线观看播放 | 日日日日日操 | 九色视频极品论坛区 | 欧美久久综合九色综合 | 青青青国产免费手机视频在线观看 | 桃花在线视频社区 | 日韩成a人片在线观看日本 日韩成人 | 色姑娘久| 99色精品 | 91精品国产综合久久婷婷 | 99国产福利 | 中文字幕亚洲一区二区三区 | 精品欧美一区二区在线观看 | 日本涩涩网站 | 久久这里是精品 |