2015-04-22 67 views
0

由于第一部分的计算结果为false,此代码是否不会评估if语句的零部分?如果是这样,所有Java IDE中的所有情况都适用?或者某些编译器会抛出异常?这个if语句会引发异常还是忽略它?

int n = 0; 
int x = 5; 
if (n != 0 && x/n > 100) { 
    System.out.println(" s1"); 
} else { 
    System.out.println("s2"); 
} 
+2

所有(正确的)Java编译器和JVM都会以同样的方式运行。至于它会做什么...为什么不试一试,亲自看看? – yshavit

+0

Java为布尔运算使用[short circuit evaluation](http://en.wikipedia.org/wiki/Short-circuit_evaluation)。只评估所需的数量。这是由[JLS 15.23](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.23)授权的**。 –

+0

糟糕,关闭这个错误的原因。让我试着找到一个更好的... – yshavit

回答

0

假设我们包括SoP的进口,并放入系统行内的静态主写的,不会有异常抛出,并s2将被打印。 X/0将永远不会在您的代码中进行评估,因为& &首先检查左表达式,因此它永远不会抛出任何东西。

+1

我不同意。如果'int n'被声明为字段而不是本地参数,并且这部分代码由多个线程执行,并且其中一个线程将'n'赋值为'0',则可能抛出异常。 –

+0

“IF”。确切地说,我只是基于我给出的代码的答案。在任何Java环境中,代码行都不会抛出异常。假设当然给出了SoP的输入。我不记得我在谈论多线程 – Mekap

+0

我们不能确定这一点。否则,代码将被发布到方法中。我们可以承担任何事情,所以这个职位也可以封闭太宽。 –

1

JLS §15.23

的条件和操作& &就像&(§15.22.2),但评估其右边的操作数只有在其左侧操作数的值是true。

所以不,你不会得到一个例外。

很明显,这假定你有一个单线程或线程安全的环境 - 如果你将可见性问题引入混合,那么这是任何人的猜测。