日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java自動拆箱空指針異常的解決

瀏覽:118日期:2022-08-15 16:06:40

公司搬遷,臨時充當裝修工,提前兩個小時到公司忙著拆卸設備。結果接到客戶反映,某部分功能偶爾不能用。于是參與救火,與寫這段代碼的小伙伴一起排查原因。

最終發現導致業務偶爾不能使用是由Long類型自動拆箱導致空指針異常引起的。下面就帶大家分析一下Java中基礎類型的包裝類在拆箱和裝箱過程中都做了什么,為什么會出現空指針異常,以及面試過程中會出現的相關面試題。

問題重現

下面通過一個簡單的示例才重現一下異常出現的場景。

public class BoxTest { public static void main(String[] args) { Map<String,Object> result = httpRequest(); long userId = (Long) result.get('userId'); } // 模擬一個HTTP請求 private static Map<String,Object> httpRequest(){ Map<String,Object> map = new HashMap<>(); map.put('userId',null); return map; }}

基本的場景就是請求一個接口,去接口中取某個值,這個值為Long類型,從Map中取得值之后,進行Long類型的強轉。當接口返回的userId為null時,強轉這塊就拋出空指針異常:

Exception in thread 'main' java.lang.NullPointerException at com.choupangxia.box.BoxTest.main(BoxTest.java:15)

上面的場景跟下面的代碼出現異常效果一樣:

public class BoxTest { public static long getValue(long value) { return value; } public static void main(String[] args) { Long value = null; getValue(value); }}

上述代碼也是將Long類型進拆箱導致的異常,只不過一個在代碼中,一個在參數中。為了分析更簡化,我們以第二個為例進行講解。

原因分析

最初大家可能會疑惑,拋出異常的代碼都沒有對象的方法調用,怎么會出現空指針呢?

這中間主要涉及到的就是一個自動拆箱操作。是否是拆箱導致的呢?我們來通過字節碼看一下。

通過javap -c來查看一下對應的字節碼:

public class com.choupangxia.box.BoxTest { public com.choupangxia.box.BoxTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.'<init>':()V 4: return public static long getValue(long); Code: 0: lload_0 1: lreturn public static void main(java.lang.String[]); Code: 0: aconst_null 1: astore_1 2: aload_1 3: invokevirtual #2 // Method java/lang/Long.longValue:()J 6: invokestatic #3 // Method getValue:(J)J 9: pop2 10: return}

其中getValue方法調用對應的是main方法中編號3和6的操作。編號3為命令invokevirtual為方法指令。對應的便是value.longValue,value對應的就是聲明的Long類型。

也就是說編譯器將getValue(value)拆分成了兩步,第一步將通過value的longValue方法將其拆箱,然后再將拆箱之后的結果傳遞給方法。相當于:

long primitive = value.longValue();test(promitive);

對照最開始的代碼,如果value為null的話,那么在調用longValue方法時便會拋出NullPointerException。所以,本質上來講,所謂的自動拆箱和裝箱只不過是Java提供的語法糖而已。

再次證實

下面用int類型的實例同時證實一下自動拆箱和自動裝箱兩個操作語法糖底層到底是怎么運行的:

public class IntBoxTest { public static void main(String[] args) { Integer index = 11; int primitive = index; }}

同樣查看上面代碼的字節碼:

public class com.choupangxia.box.IntBoxTest { public com.choupangxia.box.IntBoxTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.'<init>':()V 4: return public static void main(java.lang.String[]); Code: 0: bipush 11 2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 5: astore_1 6: aload_1 7: invokevirtual #3 // Method java/lang/Integer.intValue:()I 10: istore_2 11: return}

可以看到main方法部分,編號2進行了裝箱操作,將原始類型int,裝箱成了Integer,調用的方法為Integer.valueOf;而編號7進行了拆箱操作將Integer類型轉換成了int類型,調用的方法為Integer.intValue。

自動拆箱裝箱的本質

通過上面的分析,我們可以看出所謂的拆箱(unboxing)和裝箱(boxing)操作只不過是一個語法糖的功能。編譯器在編譯操作時,本質上還是會調用對應包裝類的不同方法來進行處理。裝箱時通常會調用包裝類的valueOf方法,而拆箱時通常會調用包裝類的xxxValue()方法,其中xxx為類似boolean/long/int等。而自動拆箱和裝箱的操作主要發生在賦值、比較、算數運算、方法調用等常見。此時,我們就需要主要空指針的問題。

面試題

看一個面試題:請問下面foo1和foo2被調用時如何執行?并簡單分析一下。

public void foo1() { if ((Integer) null == 1) { }}public void foo2() { if ((Integer) null > 1) { System.out.println('abc'); }}

很明顯在調用兩個方法時都會拋出空指針異常。關于拋空指針異常的原因及分析過程,上文已經講過,大家可以嘗試分析一下字節碼。

再看一個面試題:下面的語句能正常執行嗎?

Integer value1 = (Integer) null;Double value2 = (Double) null;Boolean value3 = (Boolean) null;

答案:可以正常執行。在Java中null是一個特殊的值,可以賦值給任何引用類型,也可以轉化為任何引用類型。

小結

任何一個小的問題,小的異常,如果深入追蹤一下,不僅能夠更清楚的明白底層原理,而且還可以在實踐的過程中更有把握,更少犯錯。

到此這篇關于Java自動拆箱空指針異常的解決的文章就介紹到這了,更多相關Java自動拆箱空指針異常內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩一区二区三区不卡视频| 亚洲另类黄色| 欧美偷窥清纯综合图区| 久久精品97| 天堂精品久久久久| 国产日韩欧美一区二区三区在线观看 | 激情欧美一区二区三区| 91精品亚洲| 欧美中文字幕| 91精品丝袜国产高跟在线| 欧美交a欧美精品喷水| 波多野结衣久久精品| 精品日韩毛片| 欧美亚洲免费| 日韩成人亚洲| 日韩手机在线| 福利片在线一区二区| 亚洲精品88| 伊人久久大香线蕉av超碰演员| 丝袜a∨在线一区二区三区不卡| 日韩欧美久久| 91欧美在线| 日韩影院免费视频| 激情综合五月| 免费人成精品欧美精品| 欧美黑人做爰爽爽爽| 亚洲国产专区| 国产精品一级在线观看| 欧美成人基地| 国产亚洲久久| 亚洲特色特黄| 国产伦精品一区二区三区千人斩| 亚洲永久av| 日本一区二区三区中文字幕| 成人看片网站| 亚州欧美在线| 99精品在线观看| 国产日韩视频在线| 国产日韩综合| 国产91在线播放精品| 欧美日韩在线二区| 国产精品美女午夜爽爽| 欧美特黄一级| 成人台湾亚洲精品一区二区| 亚洲精品高潮| 美女少妇全过程你懂的久久| 欧美精品1区| 亚洲欧美日韩专区| 日韩欧美一区二区三区在线观看 | 日韩精品中文字幕第1页| 免费人成网站在线观看欧美高清| 粉嫩av一区二区三区四区五区| 欧美午夜不卡影院在线观看完整版免费| 日韩高清欧美| 国产乱子精品一区二区在线观看| 日韩欧美久久| 日韩精品电影| 亚洲精品一二三**| 国语对白精品一区二区| 黑森林国产精品av| 亚洲激情不卡| 欧美日本久久| 视频在线观看一区| 三级精品视频| 精品精品99| 久久激情五月激情| 免费精品视频在线| aa国产精品| 国产真实久久| 98精品视频| 狂野欧美性猛交xxxx| 夜夜嗨av一区二区三区网站四季av| 高清在线一区| 六月丁香综合在线视频| 欧美性感美女一区二区| 九九综合在线| 青青伊人久久| 日韩精品一区二区三区中文 | 国产亚洲欧美日韩精品一区二区三区| 丝袜国产日韩另类美女| 亚洲精品.com| 国产黄大片在线观看| 久久一区精品| 六月丁香综合在线视频| 欧美黄色一区| 精品高清久久| 日韩av片子| 福利一区在线| 激情国产在线| 日韩国产专区| 久久裸体视频| 极品日韩av| 蜜桃国内精品久久久久软件9| 久久精品二区三区| 久久中文字幕av一区二区不卡| 日韩电影免费网址| 超级白嫩亚洲国产第一| 国产精品久久久久蜜臀| 高清日韩中文字幕| 99久久亚洲精品| 激情自拍一区| 美女尤物久久精品| 亚洲五月综合| 午夜久久av| 国产午夜精品一区在线观看| 美女视频黄 久久| а√天堂8资源中文在线| 黄毛片在线观看| 国产99亚洲| 亚洲一区二区三区高清| 免费在线观看不卡| 蜜臀久久久久久久| 国产亚洲观看| 国产精品yjizz视频网| 99久久亚洲精品| 亚洲专区一区| 久久国产欧美日韩精品| 国产69精品久久| 国产综合婷婷| 亚洲欧洲国产精品一区| 欧美综合精品| 久久久久久一区二区| 欧美日韩中文一区二区| 六月婷婷一区| 国产精区一区二区| 日韩亚洲一区在线| 91成人网在线观看| 日韩精彩视频在线观看| 福利一区二区三区视频在线观看| japanese国产精品| 18国产精品| 久久一区二区三区喷水| 亚洲精品在线二区| 成人午夜在线| 久久成人国产| 另类小说一区二区三区| 午夜精品网站| 国产精品片aa在线观看| 99久久九九| 国产欧美日韩综合一区在线播放| 九色porny丨国产首页在线| 99国产精品自拍| 麻豆精品在线| 亚洲激情不卡| 久久精品人人| 鲁大师影院一区二区三区| 国产精品久久久久久久久久齐齐| 久久免费高清| 国产精品日本一区二区不卡视频 | 亚洲精品九九| 亚洲啊v在线| 日韩国产高清在线| 日韩黄色大片| 欧美精品国产白浆久久久久| 欧美亚洲激情| 欧美激情视频一区二区三区免费 | 亚洲视频www| 国产在线不卡一区二区三区 | 最新国产精品久久久| 国产成人调教视频在线观看| 免费美女久久99| 久久久一二三| 欧美激情综合| 一本综合精品| 欧洲一级精品| 欧美国产视频| 亚洲精品少妇| 激情丁香综合| 麻豆极品一区二区三区| 亚洲狼人精品一区二区三区| 黄毛片在线观看| 国产日韩欧美高清免费| 亚洲在线网站| 欧美日韩尤物久久| 精品亚洲成人| 青青草精品视频| 美日韩精品视频| 91精品国产自产在线观看永久∴| 久久国产日韩欧美精品| 久久xxxx精品视频| 欧美成a人免费观看久久| 久久97视频| 国产精品久久久久久久久久齐齐 | 亚洲成人精选| 成人午夜网址| 美女尤物国产一区| 国产丝袜一区| 国产图片一区| 日韩不卡手机在线v区| 人人爽香蕉精品| 丝袜亚洲另类欧美| 99视频+国产日韩欧美| 极品日韩av| 欧美va亚洲va日韩∨a综合色| 精品国产一区二区三区av片| 国产欧美一区二区三区米奇| 青青草视频一区| 欧美精品三级在线| 91成人精品在线| 青青伊人久久|