java中&&和||的短路求值指结果确定时跳过右侧计算:&&左侧为false则跳过右侧,常用于避免空指针;||左侧为true则跳过右侧,常用于默认值兜底;需注意优先级、括号及避免在条件中放置副作用操作。

Java 中的 &&(短路与)和 ||(短路或)会在结果已确定时跳过右侧表达式的计算,这种机制叫短路求值。
&& 的短路行为:左边为 false 就不看右边
当用 && 连接多个条件时,Java 从左到右依次求值。只要遇到第一个操作数为 false,整个表达式结果必为 false,右侧所有表达式都不执行。
- 避免空指针异常:比如
obj != null && obj.getValue() > 0,如果obj是null,obj.getValue()就不会调用 - 控制副作用:若右侧有自增、日志或网络请求等操作,短路可防止其意外触发
- 注意:非短路的 & 会强制计算两边,即使左边已为
false
|| 的短路行为:左边为 true 就不看右边
使用 || 时,一旦左侧表达式结果为 true,整个表达式结果就是 true,右侧不再求值。
- 常用作默认值兜底:如
userConfig != null ? userConfig : defaultConfig可简写为userConfig || defaultConfig(需注意类型匹配) - 提升效率:例如在循环中
isValid() || loadFromCache(),若isValid()返回true,缓存加载就被跳过 - 非短路的 | 仍会执行右侧,哪怕左侧已是
true
优先级和嵌套要小心括号
&& 优先级高于 ||,所以 a || b && c 等价于 a || (b && c),不是 (a || b) && c。短路是否生效,取决于实际运算顺序。
- 混合使用时建议加括号明确意图,比如
(a || b) && c - IDE 常提示 “Condition is always true/false”,可能就是短路让某分支永远不被执行
- 含方法调用的条件链(如
test1() && test2() && test3()),只有前面都返回true,后面的才会被调用
短路不是流程控制,别塞太多副作用
短路本质是表达式求值策略,不是替代 if 的语法糖。把复杂逻辑或关键状态变更写在条件表达式里,会让代码难读、难测、难调试。
- 推荐只放纯判断类操作,比如非空检查、范围判断、标志位读取
- 像
saveToDB() && sendEmail()这种写法风险高——若saveToDB()失败,邮件发不出,但你可能误以为这是“正常跳过” - 真正需要顺序执行且依赖前序结果的逻辑,应该用显式的 if 或 try-catch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











