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

时间:2013-06-22 18:28:33

标签: java logic

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

if ((d != 0) && (n / d < 3)) {
    compute(a, d);
}

但如果我这样做:

if ((n / d < 3) && (d != 0)) {
    compute(a, d);
}

我收到此错误:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at compute.main(compute.java:63)

3 个答案:

答案 0 :(得分:23)

Java使用Short-Circuit Logic评估表达式。这意味着对于&&,如果左表达式是false,则Java不会考虑正确的表达式(因为整个表达式已经保证为假)。

在您的第一个示例中,如果d == 0,则d != 0为false,因此不会评估n / d。在您的第二个示例中,如果d == 0,则评估n / d < 3将为您提供除以零错误。

答案 1 :(得分:5)

在您的第一个示例中,由于short circuit evaluation,在d == 0时,编译器发现它不需要评估n/d,因为false && true仍然是假的

如果你改变条件,你最先评估n/d,然后才知道d是否为零。你所造成的是一个错误,因为除以零。

答案 2 :(得分:3)

这不是一个不一致的问题。任何源自C语言(C ++,Java,许多其他语言)的语言都以这种方式运行(将&amp;&amp;和||运算符短路)。

如果您希望评估双方,请使用&amp;和| (vs&amp;&amp;和||)。