2014-03-04 55 views
0

我真搞不清楚這個問題,我有一個返回boolean值的方法 - mainMethod(),所以我用的結果在邏輯表達式,在這裏看到:Java方法不calledin表達

boolean b = this.someMethod(); 
    b = b && this.mainMethod(); // method is not called 

我檢查jar文件通過反編譯器一切正常。然後我將上面的行更改爲:

boolean b = this.someMethod(); 
    boolean result = this.mainMethod(); // now method is called!!! 
    b = b && result; 

是否有人知道這會發生什麼?我不知道,這看起來很奇怪。

+0

如果'B'已經在第一個例子中'false'它不會繼續超過'&&'。 – AntonH

+0

OH !!!!!當然可以......謝謝 – Martin

+0

您可以使用按位運算符'&&來避免短路。您可以通過使代碼自行記錄來避免這樣的錯誤。沒有人知道'mainMethod()'返回'true'或'false'意味着什麼。如果你已經將它分配給一個像'boolean ranSuccessfully'這樣的變量,那麼你應該避免這個錯誤,並且清楚你的代碼在做什麼。 – Rainbolt

回答

6

如果this.someMethod()回報false然後this.mainMethod()將永遠不會被因在聲明中

b = b && this.mainMethod(); 
0

&&調用到&&運營商短路自然是conditional and operator。在表達

a && b 

如果afalseb將不進行評估,因爲整個表達式會falseb僅在atrue時才被評估。

那麼發生了什麼事是someMethod正在返回false; mainMethod然後不被執行,因爲已知整個表達式將評估爲false,而不管從mainMethod返回的值如何。

0

如果「B」已經是假的,這是沒有必要的評估第二表達式:

true AND ? <= ? must be evaluated 
false AND ? <= = must not be evaluated as 

false AND true => false 
false AND false => false 

所以它不事關什麼第二個表達式求。

0

以前的答案是正確的。有短路的性質。

false && method() 

永遠不會執行方法(),因爲布爾值已經是false,所以沒有任何東西可以使值返回true。在這種情況下,你正在尋找分配一個布爾值,所以它將停止評估語句。

如果您需要評估這兩種方法,仍然有布爾結果返回您需要執行的代碼通過以下方式之一:

boolean b = methodA(); 
b &= methodB(); 

boolean b = methodA(); 
b = methodB() && b;