2010-01-08 150 views
26

假設我有以下表達式Java中評估的布爾表達式順序?

Eclipse的警告我說,myString可能會在布爾表達式的第二句話是空的。但是,我知道一些編譯器會在第一個條件失敗時完全退出布爾表達式。這對於Java來說是否屬實?或者評估的順序沒有保證?

+0

您正在使用哪種編譯器或工具? – notnoop 2010-01-08 15:45:16

+0

爲什麼要重要? – danben 2010-01-08 15:46:23

+0

那麼,javac(最常見的編譯器)不會警告有關無效。如果「Java警告我myString可能爲空」,那麼最有可能是一個有問題的工具。沒有「java警告」之類的東西。 – notnoop 2010-01-08 15:48:25

回答

44

但是,我知道一些編譯器會完全退出布爾表達式,如果第一個條件失敗。這對於Java來說是否屬實?

是的,作爲Short-Circuit evaluation .Operators像&&||是執行這樣的操作的運算符是已知的。

或者是評估的順序沒有保證?

沒有,評價的順序是保證(從左至右)

1

是的,Java以這種方式實踐了對if語句的懶惰評估。如果myString == null,則不會評估if語句的其餘部分

7

Java應該從左向右評估您的語句。它使用一種稱爲short-circuit evaluation的機制來防止第二,第三和第n個條件在第一個條件爲假時進行測試。

所以,如果你的表達是myContainer != null && myContainer.Contains(myObject)myContainer爲空,第二個條件,myContainer.Contains(myObject)將不進行評估。

編輯:正如別人提到的那樣,Java在布爾條件下確實同時具有短路和非短路操作符。使用&&將觸發短路評估,並且&不會。

+1

引用:'爲了防止第一,第三和第n個條件被測試,如果第一個是錯誤的'。實際上,如果運算符是「||」,如果第一個是錯誤的,編譯器無法從第一個結論中得出總體值。 – H2ONaCl 2012-02-09 07:59:20

2

詹姆斯和Ed是正確的。如果遇到無論先前的失敗條件如何都要評估所有表達式的情況,可以使用非短路布爾運算符&