短路求值(主要是记住这个名字)

20 阅读2分钟

在 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() 返回 truetryAutoLogin() 根本不会被调用
    • 这可以节省资源,或避免不必要的副作用(比如自动登录触发网络请求)。

对比:非短路运算符(& 和 |

Java 也提供了非短路的逻辑运算符:

表格

运算符类型是否短路
&&逻辑与✅ 是
&按位与 / 逻辑与(非短路)❌ 否
``
``按位或 / 逻辑或(非短路)

注意:& 和 | 用于布尔值时,也表示逻辑运算,但不短路

示例(危险!):

if (x != 0 & y / x > 2) { ... } // 即使 x == 0,也会计算 y/x → 抛出异常!

总结

  • 短路求值是安全且高效的做法,Java 默认推荐使用 && 和 ||

  • 它能:

    • 避免运行时错误(如空指针、除零);
    • 提高性能(跳过不必要的计算);
    • 控制副作用(防止不该执行的方法被调用)。
  • 只有在明确需要两边都执行时(极少见),才考虑使用 & 或 |(例如某些位运算或特殊逻辑)。

✅ 最佳实践:绝大多数情况下,使用 && 和 ||,而不是 & 和 | 来进行布尔逻辑判断。