Java中利用&&和||的短路特性可安全避免空指针异常:&&用于先判空再访问(如user!=null&&user.getName().equals("admin")),||用于兜底逻辑,配合Objects.nonNull提升可读性。

Java 中利用逻辑运算符的短路特性(&& 和 ||)可以简洁、安全地避免空指针异常(NullPointerException),尤其在判空和条件组合时非常实用。核心思路是:让可能抛异常的操作“靠后”,并确保其执行前已有前置安全检查。
用 && 实现“先判空,再访问”
当需要调用对象的方法或访问其属性前,必须确认该对象非 null。利用 && 的左操作数为 false 时跳过右操作数的特性,可自然实现防御:
-
错误写法(可能 NPE):
if (user.getName().equals("admin")) { ... }—— 若user为null,直接抛异常 -
正确写法(短路防御):
if (user != null && user.getName().equals("admin")) { ... }—— 若user == null,整个表达式立即为false,getName()不会被调用
嵌套对象访问时链式判空
对多层嵌套对象(如 user.getProfile().getAddress().getCity()),可逐级用 && 连接判空条件:
if (user != null && user.getProfile() != null && user.getProfile().getAddress() != null && "Beijing".equals(user.getProfile().getAddress().getCity())) { ... }- 注意:每个中间调用(如
getProfile())都应放在其所属判空条件之后,确保前一步非null才执行下一步 - 虽略显冗长,但零依赖、零额外开销,适合简单场景
用 || 提供默认值或兜底逻辑
|| 的短路特性(左为 true 则跳过右)可用于“存在即用,否则取默认”模式:
立即学习“Java免费学习笔记(深入)”;
-
String name = (user != null && user.getName() != null) ? user.getName() : "anonymous";—— 安全取名 - 更简洁写法(配合三元):
String name = user != null ? user.getName() : null;再结合Objects.toString(name, "anonymous"),但纯短路表达式本身不直接返回默认值,需配合其他结构 - 常见误用:
user.getName() != null || "unknown"是语法错误(||两边必须是布尔值),不可用于“提供默认值”,这点要特别注意
与 Objects.nonNull() 配合更清晰
Java 7+ 提供 Objects.nonNull(obj)(返回 boolean),语义比 obj != null 更明确,且可读性更强:
if (Objects.nonNull(user) && Objects.nonNull(user.getRole()) && user.getRole().isAdmin()) { ... }- 它本身不防 NPE,但和短路搭配后,逻辑意图一目了然,也便于静态分析工具识别
- 注意:
Objects.nonNull(null)返回false,符合短路预期


















