电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:48日期: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
相關文章:
主站蜘蛛池模板: 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 找培训机构_找学习课程_励普教育 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 匀胶机旋涂仪-声扫显微镜-工业水浸超声-安赛斯(北京)科技有限公司 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折! | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 无机纤维喷涂棉-喷涂棉施工工程-山东华泉建筑工程有限公司▲ | 蒸汽吸附分析仪-进口水分活度仪|康宝百科 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 扬子叉车厂家_升降平台_电动搬运车|堆高车-扬子仓储叉车官网 |