千家信息网

如何解决Java自动拆箱空指针异常

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"如何解决Java自动拆箱空指针异常",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何解决Java自动拆箱空指针异常"吧!问题重现下
千家信息网最后更新 2026年11月03日如何解决Java自动拆箱空指针异常

这篇文章主要讲解了"如何解决Java自动拆箱空指针异常",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何解决Java自动拆箱空指针异常"吧!

问题重现

下面通过一个简单的示例才重现一下异常出现的场景。

public class BoxTest {      public static void main(String[] args) {         Map result = httpRequest();         long userId = (Long) result.get("userId");     }      // 模拟一个HTTP请求     private static Map httpRequest(){         Map 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."":()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."":()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自动拆箱空指针异常这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 类型 指针 装箱 代码 分析 字节 就是 面的 只不过 场景 接口 本质 语法 问题 包装 学习 编译 两个 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网技术 互联网科技战争 互联网科技集团 互联网科技缩写 无锡溥仪互联网科技有限公司 互联网巨头投资的硬核科技 汉立互联网科技有限公司联系电话 湖南洣水互联网科技有限公司扣款 互联网和高科技公司 中国科技互联网公司收入 互联网企业和科技型企业 四川慕妮娅互联网科技有限公司 上海互联网科技公司ppt 新氧科技和美国互联网有关系吗 珠海东科互联网科技有限公司 湖北辰鑫科技互联网 米泉互联网科技专业怎么样 绵阳真晨互联网科技有限公司 承德科技产业互联网平台 东风日产互联网科技公司叫什么 小米移动互联网科技园 科技金融是不是互联网金融 天扬科技互联网广告 互联网科技大会案例 滨湖区互联网智能科技产品有哪些 电子商务与互联网科技的关系 启辰互联网科技 互联网科技包装股份有限公司上市 广州有谷有贝互联网科技有限公司 互联网科技创业计划的风险分析
0