在 Java 中,短路求值(Short-circuit evaluation) 是指在逻辑表达式(使用 && 或 || 运算符)的求值过程中,一旦能够确定整个表达式的最终结果,就立即停止后续条件的计算,不再执行右边的表达式。
这是 Java 为了提高效率和避免潜在错误而设计的一种机制。
1. 短路与运算符:&&
-
规则:只要左边为
false,整个表达式必定为false,右边不再计算。 -
示例:
if (x != 0 && y / x > 2) { // ... }- 如果
x == 0,那么x != 0为false。 - 由于
&&是短路的,不会执行y / x,从而避免了除零异常(ArithmeticException)。 - 如果使用非短路的
&,即使x == 0,也会计算y / x,导致程序崩溃。
- 如果
2. 短路或运算符:||
-
规则:只要左边为
true,整个表达式必定为true,右边不再计算。 -
示例:
if (list != null || list.isEmpty()) { // 错!这里应该用 &&,但假设是 || 的场景 }更合理的例子:
if (isLoggedIn() || tryAutoLogin()) { // 如果用户已登录(isLoggedIn() 返回 true),就不会调用 tryAutoLogin() }- 如果
isLoggedIn()返回true,tryAutoLogin()根本不会被调用。 - 这可以节省资源,或避免不必要的副作用(比如自动登录触发网络请求)。
- 如果
对比:非短路运算符(& 和 |)
Java 也提供了非短路的逻辑运算符:
表格
| 运算符 | 类型 | 是否短路 |
|---|---|---|
&& | 逻辑与 | ✅ 是 |
& | 按位与 / 逻辑与(非短路) | ❌ 否 |
| ` | ` | |
| ` | ` | 按位或 / 逻辑或(非短路) |
注意:
&和|用于布尔值时,也表示逻辑运算,但不短路。
示例(危险!):
if (x != 0 & y / x > 2) { ... } // 即使 x == 0,也会计算 y/x → 抛出异常!
总结
-
短路求值是安全且高效的做法,Java 默认推荐使用
&&和||。 -
它能:
- 避免运行时错误(如空指针、除零);
- 提高性能(跳过不必要的计算);
- 控制副作用(防止不该执行的方法被调用)。
-
只有在明确需要两边都执行时(极少见),才考虑使用
&或|(例如某些位运算或特殊逻辑)。
✅ 最佳实践:绝大多数情况下,使用 && 和 ||,而不是 & 和 | 来进行布尔逻辑判断。