会抛出NullPointerException,因为int b = a;触发自动拆箱,底层执行a.intValue(),而a为null时调用实例方法必然失败。

运行时会抛出 NullPointerException(空指针异常)。
为什么会发生 NullPointerException
这行代码:int b = a; 触发了自动拆箱(unboxing)——Java 试图把 Integer 对象 a 转成基本类型 int,底层实际执行的是 a.intValue()。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
但 a 是 null,调用 null.intValue() 就等同于对一个不存在的对象调用实例方法,JVM 检测到引用为 null,立即抛出 NullPointerException。
关键点说明
-
Integer是引用类型,可以为null;int是基本类型,不能为null,必须有确定的数值 - 自动拆箱不是“安全转换”,它隐含一次方法调用(
intValue()),而任何对null的方法调用都会失败 - 编译器不会报错,因为语法合法(存在拆箱机制),但运行期必然崩溃
- 类似风险也出现在三目运算符中:如
true ? a : 0没问题,但true ? 0 : a若a == null也会在拆箱时炸
如何避免
- 赋值前显式判空:
int b = (a != null) ? a : 0; - 使用
Objects.requireNonNullElse(a, 0)(Java 9+) - 优先使用基本类型做局部变量计算,只在需要 null 语义(如数据库字段可能为空)、泛型或集合时才用
Integer - 在 API 层或 DTO 中接收
Integer时,尽早转为基本类型并设默认值,避免 null 向下游传递

















