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

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

Javase全套視頻:三目運算符

更新時間:2020-02-28 10:28:42 來源:動力節點 瀏覽1879次


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


Javase全套視頻:三目運算符


  一、三目運算符


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


  二、自動裝箱與自動拆箱


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


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


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


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


  三、問題回顧


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


  publicstaticvoidmain(String[]args){


  Map<String,Boolean>map=newHashMap<>();


  Booleanb=map!=null?map.get("test"):false;


  System.out.println(b);


  }


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


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


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


  Exceptioninthread"main"java.lang.NullPointerException


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


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


  publicstaticvoidmain(Stringargs[]){


  Mapmap=newHashMap();


  Booleanb=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,摘要如下:


  Ifthesecondandthirdoperandshavethesametype(whichmaybethenulltype),thenthatisthetypeoftheconditionalexpression.


  IfoneofthesecondandthirdoperandsisofprimitivetypeT,andthetypeoftheotheristheresultofapplyingboxingconversion(§5.1.7)toT,thenthetypeoftheconditionalexpressionisT.


  Ifoneofthesecondandthirdoperandsisofthenulltypeandthetypeoftheotherisareferencetype,thenthetypeoftheconditionalexpressionisthatreferencetype.


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


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


  五、問題解決


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


  Map<String,Boolean>map=newHashMap<String,Boolean>();


  Booleanb=(map!=null?map.get("test"):Boolean.FALSE);


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


Javase全套視頻:三目運算符


      以上就是動力節點Java培訓機構小編介紹的“Javase全套視頻:三目運算符”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美国产精品不卡在线观看 | 奇米第四影视 | 国产成人亚洲综合 | 欧美色视频日本片高清在线观看 | 一a一级片| 久久久久久噜噜噜久久久精品 | 欧美日韩国产中文字幕 | 国产精品成人久久久久 | 久青草国产高清在线视频 | 国产精品成| 日本精品a在线 | 亚洲欧美日韩一级特黄在线 | 免费毛片播放 | 最近中文字幕免费版在线3 最近中文字幕无吗高清视频 | 老司机午夜在线视频免费 | 阿v视频在线观看免费播放 阿v天堂2017 | 亚洲a在线播放 | 久久九九精品一区二区 | 午夜精品久久久久久 | 成人 在线欧美亚洲 | 亚洲国产成人麻豆精品 | 点击进入不卡毛片免费观看 | 精品偷拍模特露出丝袜在线 | 欧洲美女高清一级毛片 | 九九九视频 | 香蕉视频在线观看免费 | 亚洲精品一区二区久久这里 | 亚洲 欧美 国产 中文 | 日韩欧美中文字幕出 | 久草在线免费资源 | 色小妹综合 | 国产特黄一级毛片特黄 | 一级毛片片 | 国产成人综合日韩精品无 | 亚洲欧美中日韩中文字幕 | 国产中文字幕在线免费观看 | 久久久99精品久久久久久 | 欧美vs日韩vs国产在线观看 | 精品国产免费一区二区 | 日韩在线一 | 99热这里有免费国内精品 |