Java中&&和||天然支持短路求值:左侧确定结果时右侧不执行,提升性能并避免副作用;&和|无短路行为,可能引发空指针等异常。

Java 中的逻辑运算符 && 和 || 本身就支持短路求值(Short-circuit Evaluation),不需要额外实现——这是语言层面的内置行为。
什么是短路求值
短路求值指:在布尔表达式中,一旦能确定整个表达式的最终结果,就不再计算后续操作数。这既能提升性能,也能避免不必要的副作用(比如空指针异常、除零、方法调用等)。
- &&:左边为 false 时,右边表达式**不执行**(因为 false && X 总是 false)
- ||:左边为 true 时,右边表达式**不执行**(因为 true || X 总是 true)
对比非短路运算符 & 和 |
位运算符 & 和 | 在用于布尔类型时也做逻辑运算,但不短路:左右两边表达式都会被求值。
例如:
立即学习“Java免费学习笔记(深入)”;
String s = null;
if (s != null && s.length() > 0) { ... } // ✅ 安全:s 为 null 时,s.length() 不执行
if (s != null & s.length() > 0) { ... } // ❌ 抛出 NullPointerException
短路求值的典型应用场景
-
空安全检查:如
obj != null && obj.isValid() -
边界+访问组合:如
i >= 0 && i 0 -
避免代价高昂的操作:如
isCached() || loadFromDatabase(),缓存命中就不查库 -
条件触发副作用:如
user.isLoggedIn() || redirectToLogin()(注意:仅当 redirectToLogin() 有返回 boolean 时才适合)
注意事项
- 短路只对 && 和 || 生效;&、|、^ 均无短路行为
- 自定义类无法重载 && 或 ||(它们不能被重载),所以短路行为始终由 JVM 保证
- 不要依赖短路来“控制流程”替代 if 语句,会降低可读性(如
cond && doSomething();)


















