2015-04-22 35 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。

所以不,你不會得到一個例外。

很明顯,這假定你有一個單線程或線程安全的環境 - 如果你將可見性問題引入混合,那麼這是任何人的猜測。