国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

你真的了解Java中的三目運算符嗎?

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

三目運算符是我們經常在代碼中使用的,a= (b==null?0:1);這樣一行代碼可以代替一個if-else,可以使代碼變得清爽易讀。

但是,三目運算符也是有一定的語言規范的。在運用不恰當的時候會導致意想不到的問題。本文就介紹一個我自己曾經踩過的坑。

[[227529]]

一、三目運算符

對于條件表達式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); 這里暫且不討論這個原理是怎么實現的(何時拆箱、何時裝箱),也略過普通數據類型和對象類型的區別。

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

三、問題回顧

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

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

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

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

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

  1. Exception in thread "main" java.lang.NullPointerException 

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

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

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

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

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

好,問題終于定位到了。很明顯,上面源代碼中的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。

五、問題解決

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

  1. Map<String,Boolean> map =  new HashMap<String, Boolean>(); 
  2. Boolean b = (map!=null ? map.get("test") : Boolean.FALSE); 

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

PS:本文中的示例,只是為了更加方便讀者理解三目運算符會導致自動拆箱現象,可能在代碼中并不會直接這樣使用。但是,我自己的代碼確實發生過類似問題。這里簡化一下,為了講清楚原理。

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-05-06 12:24:57

NPE三目運算符

2021-11-26 08:07:16

MySQL SQL 語句數據庫

2018-12-21 11:24:55

Java時間處理編程語言

2023-11-01 13:48:00

反射java

2022-07-26 00:00:22

HTAP系統數據庫

2014-04-17 16:42:03

DevOps

2019-05-28 14:33:07

Javascript運算符前端

2025-01-03 08:09:15

2022-01-17 07:32:34

Java參數方法

2020-06-01 08:04:18

三目運算符代碼

2021-01-15 07:44:21

SQL注入攻擊黑客

2021-11-09 09:48:13

Logging python模塊

2025-02-24 11:16:20

2014-11-28 10:31:07

Hybrid APP

2020-02-27 10:49:26

HTTPS網絡協議TCP

2023-03-16 10:49:55

2019-09-16 08:40:42

2023-04-28 07:49:13

Javawaitsleep

2023-05-10 11:07:18

2021-05-07 06:27:29

JavaScript運算符開發
點贊
收藏

51CTO技術棧公眾號

99精品视频免费观看| 亚洲素人一区二区| 爽爽免费视频| 黄色特一级视频| 欧美日韩一区久久| 久久福利一区| 国产在线观看免费麻豆| 亚洲免费av一区二区三区| 1769国产精品| 亚洲妇熟xx妇色黄| 亚洲激情久久| 男女羞羞在线观看| 欧美性受ⅹ╳╳╳黑人a性爽| 黄色资源在线看| 丰满少妇又爽又紧又丰满69| 久久久久免费看黄a片app| 亚洲高清不卡一区| 久久精品国产欧美亚洲人人爽| 亚洲一区二区欧美激情| 亚洲欧洲免费| 成人啊v在线| 成人看片网页| 美女色狠狠久久| 中文字幕人成乱码在线观看| 蜜桃av在线| 女人裸体免费网站| 色噜噜色狠狠狠狠狠综合色一 | 99久久伊人网影院| 国产剧情在线观看一区二区| 国产91精品精华液一区二区三区| 国产一区二区三区四区大秀| 91九色美女在线视频| 久久这里只有精品18| 国产精品视频成人| 精品乱码一区| 国产成人精品久久亚洲高清不卡| 久久久成人av| 日韩一级精品视频在线观看| 婷婷夜色潮精品综合在线| 欧美性猛交xxxx偷拍洗澡| 国模一区二区三区白浆| 欧美精品国产| 成人免费观看49www在线观看| 一区二区视频免费完整版观看| 偷拍自拍在线看| 两个人看的免费完整在线观看| 一区二区三区av| 久热精品视频在线| 国产午夜精品视频免费不卡69堂| 欧洲一区在线观看| 欧美高清一级片在线观看| 欧美亚洲日本一区| 亚洲欧美视频一区| 亚洲欧美激情小说另类| 久久精品久久久精品美女| 日韩一区电影| 懂色一区二区三区免费观看| 一区二区中文字幕在线| 欧美午夜电影在线播放| 精品一区二区电影| 国产成人综合精品在线| 亚洲韩国欧洲国产日产av | 日韩国产欧美精品在线| 国产精品美女免费| 人人妻人人添人人爽欧美一区| 黄页视频在线观看| 国家队第一季免费高清在线观看| 玖草视频在线| 91在线视频免费看| 日本高清视频网站www| 久久久久狠狠高潮亚洲精品| 男人日女人的bb| 亚洲制服欧美久久| 国产日韩精品一区二区| 一区二区三区四区视频在线| 免费国产成人看片在线| 看一级黄色录像| 91久久精品一区二区别| 噜噜噜噜噜久久久久久91| 91中文字精品一区二区| 国产精品久久久久久久app| 国产精品一国产精品最新章节| 国产免费久久av| 国外成人在线直播| 久久国产精品免费一区| 任我爽在线视频精品一| 欧美大香线蕉线伊人久久| 国产天堂在线播放| 又黄又爽在线免费观看| 成年女人的天堂在线| 欧洲亚洲精品久久久久| 亚洲综合资源| 欧美综合另类| 国产亚洲成aⅴ人片在线观看| 一区二区三区四区不卡在线 | 精品自在线视频| 久久久免费高清电视剧观看| 精品久久国产精品| 88国产精品欧美一区二区三区| 国产91色在线免费| 国产成人涩涩涩视频在线观看 | 欧美草草影院在线视频| 欧美一级生活片| 国产精品最新在线观看| 亚洲午夜精品久久久中文影院av| www.中文字幕在线| 忘忧草在线影院两性视频| 午夜日韩影院| 欧美色图在线播放| 久久男人中文字幕资源站| 午夜欧美在线一二页| 日韩午夜激情电影| 国产精品二区三区四区| 青青草精品视频在线| 五丁香在线视频| 国产精品免费成人| 无码人妻丰满熟妇区五十路百度| 特黄特色大片免费视频大全| 中文在线综合| 欧美视频精品一区| 精品国产一区二区三区久久久久久| 超碰激情在线| 蜜乳av另类精品一区二区| 欧美一区二区三级| 日韩美女免费观看| 一区二区精品视频| 污污网站在线看| 免费日韩av片| 依依成人综合视频| 久久久午夜视频| 欧美三级一级片| 国精产品一区一区三区四川| 久久激情视频| 亚洲欧美综合v| 色偷偷av亚洲男人的天堂| 国产精品久久久久av免费| 在线激情视频| 欧美一级网址| 亚洲啪啪91| 国产电影一区在线| 久久成人精品电影| 亚洲欧美日韩不卡| 精品51国产黑色丝袜高跟鞋| 蜜臀av一区二区在线免费观看| 一区二区三区影院| 国产91成人video| 亚洲av首页在线| 伦理av在线| 免费永久网站黄欧美| 色妞在线综合亚洲欧美| 国语对白在线刺激| 久久九九精品| 久久国产精品亚洲| 国产乱子伦农村叉叉叉| 综合毛片免费视频| 欧美视频在线观看免费| 成人免费在线观看网站| 国产一区二区三区av电影 | 麻豆精品传媒视频| 天堂va在线高清一区| 日韩欧美另类在线| 婷婷久久五月天| 人人精品视频| 欧美三级韩国三级日本三斤 | 91高清视频在线免费观看| 欧美hdsex| 国产黄人亚洲片| 日韩 欧美 自拍| 极品中文字幕一区| 日韩一级黄色av| 久操视频在线| 亚洲国产精品麻豆| 欧美另类高清视频在线| 欧美日韩在线网站| 精品粉嫩超白一线天av| 国产av天堂无码一区二区三区| 一二三区精品| 国产成人亚洲综合青青| 在线网址91| 久久综合中文字幕| 亚洲欧洲精品在线| 怕怕欧美视频免费大全| 日韩免费一区二区| 男男电影完整版在线观看| 国产亚洲成年网址在线观看| 性刺激综合网| 精品无人区一区二区| 欧美xxxx18国产| 中文字幕高清在线播放| 亚洲人123区| 99.玖玖.com| 亚洲女同女同女同女同女同69| 九色自拍视频在线观看| 亚洲黄页一区| 影音欧美亚洲| 老牛国产精品一区的观看方式 | 精品香蕉一区二区三区| 美女欧美视频在线观看免费| 欧美激情一区在线观看| 亚洲日本精品|