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

您的位置:首頁技術(shù)文章
文章詳情頁

Java自動(dòng)拆箱空指針異常的解決

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

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

最終發(fā)現(xiàn)導(dǎo)致業(yè)務(wù)偶爾不能使用是由Long類型自動(dòng)拆箱導(dǎo)致空指針異常引起的。下面就帶大家分析一下Java中基礎(chǔ)類型的包裝類在拆箱和裝箱過程中都做了什么,為什么會(huì)出現(xiàn)空指針異常,以及面試過程中會(huì)出現(xiàn)的相關(guān)面試題。

問題重現(xiàn)

下面通過一個(gè)簡單的示例才重現(xiàn)一下異常出現(xiàn)的場景。

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

基本的場景就是請(qǐng)求一個(gè)接口,去接口中取某個(gè)值,這個(gè)值為Long類型,從Map中取得值之后,進(jìn)行Long類型的強(qiáng)轉(zhuǎn)。當(dāng)接口返回的userId為null時(shí),強(qiáng)轉(zhuǎn)這塊就拋出空指針異常:

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

上面的場景跟下面的代碼出現(xiàn)異常效果一樣:

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

上述代碼也是將Long類型進(jìn)拆箱導(dǎo)致的異常,只不過一個(gè)在代碼中,一個(gè)在參數(shù)中。為了分析更簡化,我們以第二個(gè)為例進(jìn)行講解。

原因分析

最初大家可能會(huì)疑惑,拋出異常的代碼都沒有對(duì)象的方法調(diào)用,怎么會(huì)出現(xiàn)空指針呢?

這中間主要涉及到的就是一個(gè)自動(dòng)拆箱操作。是否是拆箱導(dǎo)致的呢?我們來通過字節(jié)碼看一下。

通過javap -c來查看一下對(duì)應(yīng)的字節(jié)碼:

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}

其中g(shù)etValue方法調(diào)用對(duì)應(yīng)的是main方法中編號(hào)3和6的操作。編號(hào)3為命令invokevirtual為方法指令。對(duì)應(yīng)的便是value.longValue,value對(duì)應(yīng)的就是聲明的Long類型。

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

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

對(duì)照最開始的代碼,如果value為null的話,那么在調(diào)用longValue方法時(shí)便會(huì)拋出NullPointerException。所以,本質(zhì)上來講,所謂的自動(dòng)拆箱和裝箱只不過是Java提供的語法糖而已。

再次證實(shí)

下面用int類型的實(shí)例同時(shí)證實(shí)一下自動(dòng)拆箱和自動(dòng)裝箱兩個(gè)操作語法糖底層到底是怎么運(yùn)行的:

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

同樣查看上面代碼的字節(jié)碼:

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方法部分,編號(hào)2進(jìn)行了裝箱操作,將原始類型int,裝箱成了Integer,調(diào)用的方法為Integer.valueOf;而編號(hào)7進(jìn)行了拆箱操作將Integer類型轉(zhuǎn)換成了int類型,調(diào)用的方法為Integer.intValue。

自動(dòng)拆箱裝箱的本質(zhì)

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

面試題

看一個(gè)面試題:請(qǐng)問下面foo1和foo2被調(diào)用時(shí)如何執(zhí)行?并簡單分析一下。

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

很明顯在調(diào)用兩個(gè)方法時(shí)都會(huì)拋出空指針異常。關(guān)于拋空指針異常的原因及分析過程,上文已經(jīng)講過,大家可以嘗試分析一下字節(jié)碼。

再看一個(gè)面試題:下面的語句能正常執(zhí)行嗎?

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

答案:可以正常執(zhí)行。在Java中null是一個(gè)特殊的值,可以賦值給任何引用類型,也可以轉(zhuǎn)化為任何引用類型。

小結(jié)

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

到此這篇關(guān)于Java自動(dòng)拆箱空指針異常的解決的文章就介紹到這了,更多相關(guān)Java自動(dòng)拆箱空指針異常內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本成人在线不卡视频| 一本一本久久| 99视频精品| 爽好久久久欧美精品| 在线免费观看亚洲| 国产欧美一区二区三区米奇| 欧美国产日韩电影| 三上悠亚国产精品一区二区三区| 久久激情中文| 免费人成网站在线观看欧美高清| 日韩精品亚洲一区二区三区免费| 久久中文精品| 亚洲婷婷在线| 欧美亚洲tv| 精品少妇av| 亚洲激情中文在线| 青青在线精品| 丰满少妇一区| 99热免费精品| 国产福利资源一区| 亚洲精品网址| 国产精品视频一区二区三区四蜜臂| 91视频一区| 亚洲三级网址| 色婷婷综合网| 国产精品试看| 国产精品一区二区三区av| 欧美少妇精品| 日本a级不卡| 久久久久国产精品一区二区| 香蕉久久一区| 日韩精品午夜| 亚洲91网站| 日本久久成人网| 欧美一区=区三区| 91精品福利| 九九99久久精品在免费线bt| 蜜臀精品一区二区三区在线观看| 成人午夜亚洲| 日韩高清在线一区| 激情欧美国产欧美| 精品国产欧美日韩一区二区三区| 免费在线看一区| 亚洲播播91| 开心激情综合| 日韩精品视频在线看| 国产综合婷婷| 久久成人av| 亚洲精品一级二级三级| 久久精品免费一区二区三区| 国产精品免费大片| 亚洲精选成人| 夜夜嗨一区二区| 欧美日韩免费观看视频| 麻豆久久久久久| 日韩精品亚洲专区在线观看| 国产视频一区在线观看一区免费| 中文字幕在线官网| 麻豆免费精品视频| 91精品一区| 亚洲人成精品久久久| 午夜久久福利| 免费高潮视频95在线观看网站| 久久国产视频网| 五月激激激综合网色播| 99视频精品免费观看| 亚洲综合在线电影| 98精品久久久久久久| 国产乱码精品一区二区三区亚洲人| 一区二区三区四区在线观看国产日韩 | 日韩欧美午夜| 国产精品久久久免费| 亚洲ww精品| 久久国产精品99国产| 婷婷激情一区| 成人精品久久| 精品国产一区二区三区性色av| 青青青国产精品| 亚洲精品一区二区在线播放∴| 黄色在线一区| 日韩亚洲国产欧美| 亚洲女同中文字幕| 国产高清一区| 亚洲欧美日韩高清在线| 久久视频精品| 欧美日韩国产高清电影| 99热精品久久| 欧美成人精品| 国产一区亚洲| 亚洲天堂黄色| 米奇777超碰欧美日韩亚洲| 亚洲午夜久久久久久尤物| 欧美日韩在线播放视频| 91久久久精品国产| 午夜久久黄色| 亚洲免费网址| 蜜臀av一区二区在线免费观看| 欧美一级专区| 五月亚洲婷婷 | 中文亚洲欧美| 日韩午夜av| 麻豆亚洲精品| 亚洲欧美日本国产| 亚洲免费专区| 国产毛片一区二区三区| 国产精品久一| 国内在线观看一区二区三区| 国产传媒在线| 亚洲精品一区二区在线看| 国产精品免费看| 亚洲欧美网站在线观看| 国产精品久久亚洲不卡| av免费不卡国产观看| 136国产福利精品导航网址| 性欧美长视频| 日本成人在线不卡视频| 国产精品成人一区二区网站软件| 精品淫伦v久久水蜜桃| 日韩在线二区| 国产亚洲高清视频| 日韩精品一区二区三区中文在线 | 日本不良网站在线观看| 欧洲激情综合| 日韩国产一区二| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美亚洲人成在线| 精品久久中文| 欧美福利专区| 欧美日本一区| 久久婷婷久久| 日韩精品免费观看视频| 久久电影tv| 91成人精品| 欧美午夜三级| 欧美日韩一二| 日韩va欧美va亚洲va久久| 精品国产欧美日韩一区二区三区| 久久久久久久久99精品大| 亚州精品视频| 桃色av一区二区| 亚洲免费专区| www.九色在线| 亚洲精品三级| 黄色aa久久| 少妇高潮一区二区三区99| www在线观看黄色| 少妇精品久久久一区二区| 精品深夜福利视频| 午夜一级久久| 国产一区二区精品福利地址| 香蕉视频成人在线观看| 岛国精品一区| 日韩精品一区二区三区中文在线 | 欧美亚洲激情| 国产精品流白浆在线观看| 久久免费黄色| 久久精品99国产精品日本| 激情欧美日韩一区| 国产精品白丝久久av网站| 欧美精品自拍| 成人精品久久| 国产精品一区二区三区四区在线观看| 久久高清免费| 精品视频在线观看网站| 亚洲一区二区三区久久久| 成人精品亚洲| 久久99高清| 久久精品超碰| 亚洲日本免费电影| 伊人久久成人| 日韩电影二区| 国产精品久久免费视频| 一区二区亚洲视频| 91高清一区| 久久九九国产| 国产精品二区不卡| 国产精品一二| 日韩国产在线一| 综合激情网站| 久久香蕉精品| 欧美午夜精彩| 亚洲一区资源| 精品国产乱码久久久久久1区2匹| 日本不卡一区二区三区| 中文一区一区三区免费在线观| 久久精品导航| 国产精品原创| 精品日韩在线| 免费在线观看一区| 国产乱码精品一区二区亚洲| 蜜臀av一区二区在线免费观看| 欧美日韩国产免费观看视频| 亚洲www免费| 在线看片福利| 亚洲黄色网址| 高清不卡一区| 精品国产99| 麻豆成全视频免费观看在线看| 黄色网一区二区| av中文字幕在线观看第一页|