与&&的不一致和Java中的除零错误

use*_*229 5 java logic

我开始使用Java,我遇到了一些不一致的问题.为什么这样做:

if ((d != 0) && (n / d < 3)) {
    compute(a, d);
}
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

if ((n / d < 3) && (d != 0)) {
    compute(a, d);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at compute.main(compute.java:63)
Run Code Online (Sandbox Code Playgroud)

jh3*_*314 23

Java使用短路逻辑评估表达式.这意味着&&,如果左表达式是false,则Java不会考虑正确的表达式(因为整个表达式已经保证为假).

在您的第一个示例中,if d == 0,d != 0则为false,因此不会进行评估n / d.在你的第二个例子中,如果d == 0,那么评估n / d < 3会给你除以零的误差.

  • 另外:这种"短路"行为并非特定于Java - 大多数编程语言都支持它. (4认同)
  • 另请参阅Java语言规范:[Conditional-And Operator &&](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.23) - 条件和operator &&与&(§15.22.2)类似,但仅在其左侧操作数的值为true时才计算其右侧操作数. (2认同)

Mar*_*ano 5

在你的第一个例子中,由于短路评估,d == 0编译时发现它不需要评估n/d,因为它false && true仍然是假的.

如果你改变条件,你n/d最先评估,然后才知道d是否为零.由于除以零,导致的错误是错误.