5

我开始使用 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)
4

3 回答 3

23

Java 使用Short-Circuit Logic计算表达式。这意味着对于&&,如果左边的表达式是false,那么 Java 不会费心评估右边的表达式(因为整个表达式已经保证为假)。

在您的第一个示例中, if d == 0, thend != 0是假的,所以它不会评估n / d。在你的第二个例子中,如果d == 0,那么评估n / d < 3会给你除以零的错误。

于 2013-06-22T18:29:09.363 回答
5

在您的第一个示例中,由于短路评估,当d == 0编译器发现它不需要评估n/d时,因为false && true仍然是错误的。

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

于 2013-06-22T18:31:08.020 回答
3

这不是矛盾。任何从 C 语言(C++、Java 和许多其他语言)派生的语言都以这种方式运行(将 && 和 || 运算符短路)。

如果您希望双方都评估,请使用 & 和 | (与 && 和 || 相比)。

于 2013-06-22T18:35:08.443 回答