2012-04-15 30 views
11

兩個條件運算& &和行爲||短路按照
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html,這意味着第二個操作數不需要在時間進行評估。短路條件OR運算符(||)

可能有人請提供一個例子,其中有條件OR(||)運算符是短路?

的短路行爲是與條件-AND(& &)操作非常簡單,如:

如果(假& &(1> 0)),則第二個操作數:(1> 0)將不需要評估,但似乎無法找到/想象一個條件OR的例子。

+1

當第一個操作數的結果可以定義邏輯操作的結果時,會發生短路。對於'&&'第一個變成'false'肯定會使結果'false',對於'||'第一個變爲真會使結果'true'確定。因此,第一個操作數是「真」,將總是爲'||'操作符短路。 – 2012-04-15 19:02:16

+1

爲什麼用||更簡單?它與&&完全一樣簡單。當整個條件的值已知時停止表達式的計算。表達式從左到右進行評估。 – 2012-04-15 19:23:17

+0

@MichaelSchmeißer:對不起,我不知道我是如何錯過它的直截了當。 – Vivek 2012-04-15 21:06:39

回答

1
if(true || (0 > 1)) 

第一條語句是真實的,所以它是沒有必要的評估第二。

15

的或操作者被短路時,第一操作數是真實的。所以,

String foo = null; 
if (true || foo.equals("")) { 
    // ... 
} 

不拋出NullPointerException

由於@prajeesh正確地在評論中指出,在方式,短路是真正的代碼中使用是爲了防止NullPointerException每當你面對的可能返回null的API。所以,舉例來說,如果有一個readStringFromConsole方法,它返回無論是現有的字符串或NULL,如果用戶不輸入任何東西,我們可以寫

String username = readStringFromConsole(); 
while (username == null || username.length() == 0) { 
    // No NullPointerException on the while clause because the length() call 
    // will only be made if username is not null 

    System.out.println("Please enter a non-blank name"); 
    username = readStringFromConsole(); 
} 

// Now do something useful with username, which is non-null and of nonzero length 

作爲一個側面說明,返回用戶輸入的API應該在用戶不輸入任何內容時返回空字符串,並且不應該返回null。返回null是一種說「沒有任何可用」的方式,而返回空字符串是一種說「用戶沒有輸入任何內容」的方式,因此是首選。

+1

我沒有得到這種具體的'真實||的情況foo.equals(「」)使得事物顯得合乎邏輯,它應該是'if(foo == null || foo.equals(「」))'當'foo'爲空時將短路,從而阻止NPE 。 – 2012-04-15 18:59:08

1
if (true || comparison) 

比較永遠不會被評估,因爲它的結果是不相關的(因爲第一個參數已經是真的)。