兩個條件運算& &和行爲||短路按照
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html,這意味着第二個操作數不需要在時間進行評估。短路條件OR運算符(||)
可能有人請提供一個例子,其中有條件OR(||)運算符是短路?
的短路行爲是與條件-AND(& &)操作非常簡單,如:
如果(假& &(1> 0)),則第二個操作數:(1> 0)將不需要評估,但似乎無法找到/想象一個條件OR的例子。
兩個條件運算& &和行爲||短路按照
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html,這意味着第二個操作數不需要在時間進行評估。短路條件OR運算符(||)
可能有人請提供一個例子,其中有條件OR(||)運算符是短路?
的短路行爲是與條件-AND(& &)操作非常簡單,如:
如果(假& &(1> 0)),則第二個操作數:(1> 0)將不需要評估,但似乎無法找到/想象一個條件OR的例子。
if(true || (0 > 1))
第一條語句是真實的,所以它是沒有必要的評估第二。
的或操作者被短路時,第一操作數是真實的。所以,
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是一種說「沒有任何可用」的方式,而返回空字符串是一種說「用戶沒有輸入任何內容」的方式,因此是首選。
我沒有得到這種具體的'真實||的情況foo.equals(「」)使得事物顯得合乎邏輯,它應該是'if(foo == null || foo.equals(「」))'當'foo'爲空時將短路,從而阻止NPE 。 – 2012-04-15 18:59:08
if (true || comparison)
比較永遠不會被評估,因爲它的結果是不相關的(因爲第一個參數已經是真的)。
當第一個操作數的結果可以定義邏輯操作的結果時,會發生短路。對於'&&'第一個變成'false'肯定會使結果'false',對於'||'第一個變爲真會使結果'true'確定。因此,第一個操作數是「真」,將總是爲'||'操作符短路。 – 2012-04-15 19:02:16
爲什麼用||更簡單?它與&&完全一樣簡單。當整個條件的值已知時停止表達式的計算。表達式從左到右進行評估。 – 2012-04-15 19:23:17
@MichaelSchmeißer:對不起,我不知道我是如何錯過它的直截了當。 – Vivek 2012-04-15 21:06:39