空值合并运算符??专用于null/undefined回退,不误伤0/false/''等假值;配合?.安全访问嵌套属性;可链式取首个非null/undefined值;优先级低于&&/||,需括号明确逻辑。

空值合并运算符 ?? 的核心作用,就是专门、且仅针对 null 和 undefined 做判断并回退,默认值只在真正“缺失”时生效,不会误伤 0、false、'' 等合法假值。
只对 null 和 undefined 触发回退
?? 的判定逻辑非常干净:左侧操作数只要不是 null 也不是 undefined,就直接返回它;只有当它是二者之一时,才取右侧默认值。
-
null ?? 'fallback'→'fallback' -
undefined ?? 42→42 -
0 ?? 42→0(0 是有效数字,不触发) -
false ?? 'no'→false(false 是明确布尔值,不触发) -
'' ?? 'empty'→''(空字符串是合法字符串,不触发)
搭配可选链 ?. 安全访问嵌套属性
单独用 ?? 不能防止访问 user.profile.age 时因 user 或 profile 为 null/undefined 报错。必须先用 ?. 拦截可能的访问异常,再用 ?? 提供兜底:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
user?.settings?.theme ?? 'light'—— 即使user为null,也不会报错,最终返回'light' -
data?.items?.[0]?.name ?? 'N/A'—— 多层安全读取 + 缺失时默认
链式使用选出第一个“已定义”值
多个候选变量中,按优先级顺序取第一个非 null/非 undefined 的值:
firstName ?? lastName ?? nickName ?? 'Anonymous'config?.timeout ?? env?.DEFAULT_TIMEOUT ?? 5000- 注意:链式 ?? 是左结合,等价于
((a ?? b) ?? c),行为稳定可靠
避开常见陷阱:优先级与误用场景
?? 的优先级低于 && 和 ||,混合使用时容易出错:
- ❌
a ?? b || c实际执行为a ?? (b || c),可能不符合预期 - ✅ 应写成
(a ?? b) || c,先做空值回退,再做逻辑判断 - ⚠️ ?? 对
{}、[]、NaN、'0'等均无感知——它们都不是null或undefined,所以不会触发默认值。如需处理空对象或空字符串,要额外加判断:(obj ?? {})?.length ? obj : 'default'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










