直接用包装类参与条件判断易因null触发自动拆箱导致NullPointerException;应使用Boolean.TRUE.equals(flag)、Objects.nonNull(flag) && flag或Objects.equals(user.getStatus(), 1)等null安全写法。

条件判断中直接用包装类(如 Boolean、Integer)参与 if、while 或三目运算,极易因 null 触发自动拆箱,导致 NullPointerException。这不是语法错误,编译能过,但运行时一碰空值就崩。
别在 if 里直接用 Boolean 对象
错误写法:
if (flag) { ... }一旦 flag 是 null,JVM 会尝试调用 flag.booleanValue(),立刻抛 NPE。
安全写法(任选其一):
立即学习“Java免费学习笔记(深入)”;
-
if (Boolean.TRUE.equals(flag))—— 利用equals的 null 安全性 -
if (Objects.nonNull(flag) && flag)—— 显式判空再取值 -
if (Optional.ofNullable(flag).orElse(false))—— 语义清晰,适合复杂逻辑链
Integer 等数值型包装类参与条件判断要先转基本类型或兜底
比如判断状态码是否有效:
if (status > 0) { ... }若 status 为 null,此处隐式拆箱失败。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
推荐方式:
if (Objects.requireNonNullElse(status, 0) > 0)-
if (status != null && status > 0)—— 短路判断,安全高效 - 把条件提取成方法:
isValidStatus(status),内部统一处理 null
三目运算符里混用包装类和基本类型是高危区
下面这行代码看着没问题,但很危险:
boolean result = flag ? getValue() : false;如果 getValue() 返回 null,三目表达式结果类型是 Boolean,后续若被用于 if 或赋值给 boolean,就会在赋值/使用瞬间拆箱报错。
稳妥做法:
- 强制保证返回类型一致且非空:
flag ? getValue() : Boolean.FALSE - 或提前转换:
flag ? (getValue() != null ? getValue() : false) : false - 更简洁:
Objects.requireNonNullElse(getValue(), false)
数据库/缓存/接口返回的包装类字段,条件前必须做空防护
MyBatis 映射的 Integer status、Redis get("count") 返回的 Long、RPC 接口返回的 Boolean success——这些都可能是 null。
不要写:
if (user.getStatus() == 1)应写成:
-
if (Objects.equals(user.getStatus(), 1))——Objects.equals内部已防 null if (Optional.ofNullable(user.getStatus()).filter(v -> v == 1).isPresent())- 或统一在 DTO 层加默认值:如
@TableField(fill = FieldFill.INSERT)配合数据库COALESCE

















