integer为null时自动拆箱会抛出nullpointerexception,因其本质是调用intvalue()方法;应避免隐式拆箱,改用判空后取值或工具类如numberutils.toint。

当 Integer 对象为 null 时,自动拆箱(即转为 int)会直接抛出 NullPointerException。根本原因是:拆箱操作本质是调用 intValue() 方法,而对 null 调用该方法必然失败。
避免在可能为 null 的 Integer 上直接拆箱
最直接的预防方式是不依赖自动拆箱,改用显式判空 + 安全取值。
- 用
Objects.nonNull(i)或i != null先判断再取值 - 推荐写法:
int value = (i != null) ? i : 0;(Java 8+ 可用Optional.ofNullable(i).orElse(0)) - 不要写
int x = integerValue;这类隐式拆箱语句,尤其在从 Map、JSON 解析、数据库查询结果中获取Integer时
统一使用基本类型 int 的场景要格外谨慎
方法参数、返回值、变量声明中若明确不需要 null 语义,优先用 int 而非 Integer。
- 例如 DTO、VO 中的数值字段,除非需区分“未设置”和“0”,否则别用包装类
- 数据库映射时,MyBatis 或 JPA 若字段允许为 NULL,对应属性应为
Integer;但业务逻辑层处理前应校验或转换 - 避免把
int参数误传给期望Integer的泛型方法(如list.add(123)是Integer,但map.get(null)返回可能是null)
借助工具方法或 Lombok 简化判空逻辑
重复写 i != null ? i : 0 易出错且冗余,可封装或利用现成方案。
- Apache Commons Lang 提供
ObjectUtils.defaultIfNull(i, 0) - Lombok 的
@Builder.Default或自定义 getter(如public int getValue() { return value == null ? 0 : value; }) - Spring 的
NumberUtils.toInt(Integer i, int defaultValue)是安全选择
排查常见高危场景
这些地方最容易漏掉 null 检查:
- 从
Map<string integer></string>中 get 键值——键不存在时返回null,直接赋给int就崩 - JSON 反序列化(如 Jackson)时,字段缺失或为
null,反成Integer null - 数据库查询结果中某列为 NULL,ORM 映射后得到
Integer null,后续参与计算未判空 - 三元表达式中混用包装类与基本类型:
condition ? i : 0若i为null,仍会触发拆箱异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











