Boolean是唯一可为null的布尔类型,直接参与逻辑运算会因自动拆箱触发NullPointerException;应使用Boolean.TRUE.equals(flag)、Optional<Boolean>或基本类型+默认值规避。

Java 中 Boolean 是唯一能为 null 的布尔相关类型,而 boolean 基本类型永远非空。在条件判断中直接用 Boolean 参与逻辑运算(如 if (flag)、flag && other 或三元表达式),极易触发自动拆箱导致 NullPointerException。关键不是“怎么判空”,而是“怎么避开拆箱”。
别让 Boolean 走进自动拆箱路径
以下写法都会崩溃(即使条件为 false):
-
Boolean flag = null; if (flag) { ... }→ 拆箱调用flag.booleanValue() -
Boolean flag = null; boolean result = flag || true;→ 同样触发拆箱 -
Boolean flag = null; String s = flag ? "yes" : "no";→ 三元表达式强制统一类型,对 null 拆箱
根本原因:JVM 在这些上下文中要求 Boolean 必须转成 boolean,而 null.booleanValue() 必抛异常。
安全写法:显式判空 + 明确语义
用 == 或 Objects.equals() 替代隐式转换:
立即学习“Java免费学习笔记(深入)”;
-
if (Boolean.TRUE.equals(flag))— 安全,Boolean.equals(null)返回false -
if (Boolean.FALSE.equals(flag))— 同理,区分false和null -
if (flag != null && flag)— 先判空再解包,&&短路确保不拆箱 null - 避免
flag == true:它等价于flag != null && flag.booleanValue() == true,仍会拆箱
用 Optional 封装业务语义
当 null 有明确含义(如“未设置”、“状态未知”),推荐用 Optional<Boolean> 替代裸 Boolean:
Optional<Boolean> flag = Optional.ofNullable(getFlag());-
if (flag.orElse(false)) { ... }— 默认值兜底 -
flag.filter(b -> b).isPresent()— 显式表达“存在且为 true” - 方法返回类型声明为
Optional<Boolean>,调用方必须处理空情形,从 API 层杜绝误用
重构建议:优先用基本类型 + 默认约定
多数场景下,null 并非必要。可改用 boolean 基本类型加业务默认值:
- 接口参数/DTO 字段:用
boolean isActive(),JSON 反序列化时设默认false - 数据库映射:字段设
NOT NULL DEFAULT FALSE,避免查出null - 配置项:定义
public static final boolean FEATURE_ENABLED = true;,无歧义 - 仅当“三态”(true/false/unknown)是核心业务需求时,才保留
Boolean并全程用Boolean.TRUE.equals(x)判断


















