關(guān)于三目表達(dá)式問題

記錄一個使用三目表達(dá)式時遇到的問題:問題是由三目表達(dá)式與自動拆箱同時使用造成的(顯然自動拆箱并不是我自己主動調(diào)用的)

首先來看出問題的代碼:

Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : 0);

該段代碼運(yùn)行結(jié)果為空指針,既然報(bào)空指針說明是有null對象調(diào)用了某個方法,這段代碼中也就map.get("test")這一處調(diào)用,map已經(jīng)事先初始化過了所以不會是null。于是我將該class文件進(jìn)行了反編譯:

Map map = new HashMap();
Integer i = Integer.valueOf((map != null) ? ((Integer) map.get("test")).intValue() : 0);

可以看到, ((Integer) map.get("test")).intValue()這里的 map.get("test")的返回值是null,之后強(qiáng)轉(zhuǎn)為Integer還是null,所以null調(diào)用intValue()導(dǎo)致了空指針異常。

這里就要注意三目運(yùn)算符的語法規(guī)范了,簡單的來說就是:當(dāng)?shù)诙?,第三位操作?shù)分別為對象和基本類型時,其中的對象就會拆箱為基本類型。

所以,結(jié)果就是:由于使用了三目運(yùn)算符,并且第二、第三位操作數(shù)分別是對象和基本類型。所以對對象進(jìn)行拆箱操作,由于該對象為null,所以在拆箱過程中調(diào)用null.intValue()的時候就報(bào)了空指針。 所以正確的寫法應(yīng)該是:

Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : Integer.valueOf(0));

反編譯的結(jié)果為:

Map map = new HashMap();
Integer i = (map != null) ? (Integer) map.get("test") : Integer.valueOf(0);

可以看到,當(dāng)?shù)诙?,第三位操作?shù)都是對象時就不會進(jìn)行拆箱操作,也就不會出現(xiàn)上述問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,643評論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,789評論 11 349
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,895評論 0 11
  • 目錄前一章 第六章 毛躁導(dǎo)致的,永遠(yuǎn)是最容易犯卻又最不該犯的錯誤,它們埋葬青春,它們正是青春。 劉慶寶被劉全有拎到...
    青年太白閱讀 551評論 4 1
  • 文/愛啃骨頭的貓咪 《孤獨(dú)的時候,不如吃茶去》是講一個廢柴母親的艱辛創(chuàng)業(yè)史。珍娜?繆賽卡,為給患有腎病的兒子籌集手...
    愛啃骨頭的貓咪閱讀 514評論 1 2

友情鏈接更多精彩內(nèi)容