java中逻辑短路是&&和||的固有规则:&&左为false或||左为true时,右侧完全不求值;反之必须执行右侧;用自增、打印等副作用可验证;典型应用是防御空指针,如obj!=null&&obj.isactive();非短路的&和|会强制求值,应避免在布尔表达式中误用。

Java 中的逻辑短路现象不是“被处理”的额外行为,而是 && 和 || 运算符的**固有执行规则**——只要左侧操作数已能确定整个表达式结果,右侧就完全不求值,连副作用(如方法调用、自增、赋值)都不会发生。
短路触发的明确条件
判断是否短路,只看左侧表达式的布尔值和运算符类型:
- && 左侧为 false → 短路生效:右侧整个表达式跳过,不计算、不执行任何子操作
- || 左侧为 true → 短路生效:右侧整个表达式跳过,无论它多复杂或多危险
- 反之,&& 左侧为 true 时必须执行右侧;|| 左侧为 false 时也必须执行右侧
用副作用直观验证短路是否发生
最可靠的方式是把有可观测效果的操作放在右侧,比如自增、打印、方法调用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写
int b = 2; (false) && (++b > 0);→ b 仍是 2(++b没运行) - 写
static boolean log() { System.out.println("called"); return true; },再执行true || log()→ 控制台无输出 - 常见误用:
str.length() > 0 && str != null是错的,应写成str != null && str.length() > 0,否则空指针先报错
短路在真实场景中的关键作用
它不只是省点性能,更是防御性编程的基础:
-
避免空指针异常:如
obj != null && obj.isActive(),obj 为 null 时不会调用isActive() -
防止越界或非法状态访问:如
list != null && !list.isEmpty() && list.get(0) > 5 -
控制递归终止(无 if 场景):利用
n > 0 && sum += f(n-1),n=0 时右侧递归不触发
注意非短路运算符的干扰
& 和 | 是按位逻辑运算符,在布尔上下文中也作逻辑运算,但不短路:
-
false & methodCall()仍会执行methodCall(),哪怕左侧是 false - 日常条件判断中应坚持用
&&/||,除非明确需要强制求值 - IDE 常对
&在布尔表达式中报黄警告,就是提醒你可能误用了非短路版本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










