2012-07-23 41 views
1

回顧一段舊代碼的變化,我看到了一個非常有趣的變化。有區別:jvm在這兩個java行有什麼區別:

if(retValue.equals("") || retValue == null){ 

if(retValue == null || retValue.equals("")){ 

有什麼建議嗎? jvm有什麼不同?

謝謝。

回答

5

||&&運算符是「懶惰」的:JVM一旦確定結果就會停止對錶達式的評估。

  • ||的情況下,只要其中一個操作數爲真,它就會停止==>整個表達式爲真。
  • 對於&&,只要其中一個操作數爲false,它就會停止==>整個表達式爲false。從JLS #15.24(重點煤礦)

報價:

的條件,或運營商||操作就像|(§15.22.2),但評估其右邊的操作數只有當值它的左側操作數是假的

+0

+1用於解釋這種行爲,稱爲[短路評估](http://en.wikipedia.org/wiki/Short-circuit_evaluation) – Wiseguy 2012-07-23 14:07:08

+0

謝謝。問題解決了 ) – 2012-07-23 14:12:17

5

當然。有一個明顯的區別。例如,在retValue爲null的情況下,第一個會導致NullPointerException。

+0

-1解釋爲什麼應該幫助明確爲什麼會發生這種情況。 CFR短路評估。 – maasg 2012-07-23 14:10:26

0

如果其中任何一個語句爲真,則返回true。 這意味着如果將僅檢查第一條語句(例如,在第二行代碼)

retValue == null 

,不會檢查第二,如果第一是真實的。這意味着第一行代碼可能意味着NullPointerException,如果retValue爲null,但第二行不會有NullPointerException,對於相同的輸入。