java短路逻辑运算符&&和||通过左侧结果确定整体真假时跳过右侧执行,将安全守门条件(如非空检查)放左侧、高风险操作放右侧,可预防空指针、除零、越界等异常;需避免右侧副作用及误用非短路的&。

Java 短路逻辑运算符(&& 和 ||)避免异常的核心,是利用“左侧结果已能确定整体真假时,跳过右侧执行”这一特性,把高风险操作(如方法调用、属性访问)放在右侧,而把安全守门条件(如非空检查、范围校验)放在左侧。
防止空指针异常:逐层守门,一步都不能少
访问对象链时,不能只判最外层;必须每级都作为 && 的前置条件:
-
✅ 安全写法:
user != null && user.getProfile() != null && user.getProfile().getAvatar() != null && user.getProfile().getAvatar().getUrl() != null -
❌ 危险写法:
if (user != null) { String url = user.getProfile().getAvatar().getUrl(); }—— 一旦 getProfile() 返回 null,立刻 NPE - 关键点:判空和取值必须锁在同一个表达式里,短路才起作用
规避其他运行时异常:不止是 null
短路逻辑同样适用于预防除零、数组越界、类型转换失败等常见异常:
-
防除零:
divisor != 0 && value / divisor > 10 -
防越界:
i >= 0 && i -
防字符串方法异常:
str != null && !str.trim().isEmpty()(trim() 不会因 null 调用,但 isEmpty() 会——所以 str != null 是必要前置)
安全前提:避开副作用陷阱
如果右侧表达式有副作用(比如修改变量、发日志、触发 IO),依赖短路可能导致它被跳过,从而引发逻辑错误:
-
❌ 避免这样写:
isValid() && log("success") && saveToDB()—— log 和 saveToDB 可能不执行 -
✅ 正确做法:把必须执行的逻辑提前或后置为独立语句
log("checking");<br>if (isValid()) { saveToDB(); } - 若真需组合,可用逗号运算符(仅限无风险场景):
if ((log("check"), isValid())) { ... }
别踩坑:& 和 && 别混用
& 是位运算符(布尔上下文中也存在),它不短路,左右两边一定执行:
-
❌ 错误示范:
if (user != null & user.isActive())—— user 为 null 时,user.isActive()仍会被调用,直接抛 NPE - ✅ 唯一正确选择:所有防御性判断一律用 &&,这是 Java 中保障空安全的事实标准
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











