逻辑短路(&&和||)是Java中控制执行流程的关键机制:左边结果确定时,右边表达式不执行;&&左假则跳过右,||左真则跳过右;而&和|无短路,必执行两边,易引发空指针等异常。

Java 中的逻辑短路(&& 和 ||)在条件判断里不是“可有可无的优化”,而是控制执行流程的关键机制——它直接决定右边的表达式会不会被执行。
短路的核心行为:左边定结果,右边不运行
这和性能无关,首要价值是安全与可控:
-
&&:左边为
false,整个结果必为false,右边跳过不执行 -
||:左边为
true,整个结果必为true,右边跳过不执行 - 反例:
&和|没有短路,左右两边一定都执行,容易引发空指针、重复调用或意外副作用
最常用的安全防护场景
短路天然适合处理“前置依赖”类判断,避免运行时异常:
- 防空指针:
obj != null && obj.getName().length() > 0—— obj 为 null 时,getName()根本不会调用 - 防越界:
i >= 0 && i 10—— 前两个条件不满足,arr[i]不会访问 - 防除零:
divisor != 0 && value % divisor == 0 - 防文件/资源异常:
file.exists() && file.canRead() && readContent(file).contains("key")
合理安排条件顺序提升实效性
短路是否生效,取决于你把哪个条件放左边:
- 对 &&:把“最容易失败”或“开销最小”的条件放左,例如
str != null && !str.isEmpty() && str.length() - 对 ||:把“最容易成功”或“响应最快”的条件放左,例如
isCached() || fetchFromRemote() - 错误示范:
expensiveCheck() && user.isValid()—— 每次都先执行耗时操作,短路形同虚设
需要警惕的误用情况
短路虽好,但不能掩盖逻辑意图或引入隐性风险:
- 右边有日志、计数、状态变更等副作用?别放进去——
isValid() && logAccess()可能漏记日志 - 多个校验都要触发(比如收集全部错误)?不能合并在一个
&&里,应分开调用再组合变量判断 - 含
await的异步调用?await a() && await b()不会短路异步过程,a()总是先完成 - 嵌套过深(如
a && b && c && d && e())会影响可读性和 JIT 编译效果,复杂逻辑建议拆成独立方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











