2013-10-31 19 views
1

好吧,我正在構建程序來檢查很多領域。如果至少有1個字段不行,那麼我不希望我的程序花時間檢查其他字段。所以讓我們來看看這段代碼:如果isOK = false,Java是否浪費時間檢查conditionA中的「if(isOK && conditionA)」?

// Util.isReadyToUse method return true if the string is ready for using, & return false if it is not. 

boolean isOK=true; 

if(!Util.isReadyToUse(firstName)){ 
    isOK=false; 
} 
else if(isOK && !Util.isReadyToUse(lastName)){ 
    isOK=false; 
} 
else if(isOK && !Util.isReadyToUse(email)){ 
    isOK=false; 
} 
.....more checking 
if(isOK) { 
    //do sthing 
} 

好吧,運行時,程序會先檢查!Util.isReadyToUse(firstName)。假設它返回(isOK = false)。接下來該程序將檢查isOK && !Util.isReadyToUse(lastName)

所以我這裏的問題是,由於isOK目前是假的,那麼程序會花費時間檢查!Util.isReadyToUse(lastName)之後的條件&&

好吧,作爲一個人,如果你看到isOK=false現在你看isOK && !Util.isReadyToUse(email),那麼你不想浪費時間去看看!Util.isReadyToUse(email)因爲ISOK =虛假和u isOK後看到&&

機器也能這樣工作嗎?

我想用break但爲什麼人們說break不if語句工作在:

if(!Util.isReadyToUse(firstName)){ 
    isOK=false; 
    break; 
} 
else if(isOK && !Util.isReadyToUse(lastName)){ 
    isOK=false; 
    break; 
}...... 

什麼是在這種情況下,最好的解決辦法?

+0

您的程序不會執行您的第一條語句'假設它返回(isOK = false)。接下來,程序將檢查ISOK &&!Util.isReadyToUse(lastName的)'因爲你有一個else – RamonBoza

+1

號在Java''&&是短路操作。見http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html – iamnotmaynard

+0

之初ISOK = true,所以它會檢查 – Tum

回答

7

所以在這裏,我的問題是,由於目前ISOK false,那麼將 程序花費時間& &後檢查的條件 !Util.isReadyToUse(lastName的)?

Java是聰明的,如果你有一個條件if(somethingFlase && something),然後something不會達到因Short-circuit evaluation。由於無論第二個條件如何,整個表達式都是false,因此Java不需要評估它。

15.23. Conditional-And Operator &&

如果所得到的值是假,條件和 表達式的值是假,右手操作數表達是不 評價。如果左側操作數的值爲true,則評估右側表達式。

  • if(a && b) - 如果afalseb將不檢查。
  • if(a && b) - 如果atrue,b將被檢查,因爲如果它是false,表達式將是false
  • if(a || b) - 如果atrue,b將不會被檢查,因爲無論如何這是true
  • if(a || b) - 如果afalseb將被選中,因爲如果btrue那麼它會true
+0

人? – Tum

+3

@MinhHai是的,有時它甚至可以走你的狗:) – Maroun

+0

你非常喜歡 – Tum

2

不,它會縮短謂詞的其餘部分。

這就是你會看到像

if(A != null && A.SomeVal == someOtherVal) 
0

東西你並不需要上的if..else使用break,如果.. else語句,因爲一旦它找到一個條件是真,其餘AREN」 t甚至看着。

1

Java支持所謂的短路評估。看到這個頁面:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

這意味着,如果在你的語句中的第布爾是足以滿足的說法,那麼其餘值被跳過。如果我們有以下幾點:

boolean a = false; 
boolean b = true; 

if(a && b) /*Do something*/; 

「B」永遠不會被選中,因爲假值「a」是不夠的,打破了if語句。

這就是說,你的程序將永遠不會利用這一點,因爲唯一的時間isOK設置爲false是在你的else if陳述之一。

1

正如其他響應者提到的Java將做的聰明的事情。

但可能出現這種情況,您希望Java繼續檢查,在這種情況下,您可以使用&而不是& &或| vs ||。

if (someMethod() | anotherMethod() { 

如果第一種方法重新成立,Java仍然會執行第二種方法。

if (someMethod() & anotherMethod() { 

如果第一種方法是false,Java仍然會執行第二種方法。

+0

請不要使用第二個。這是合理的唯一原因是,如果anotherMethod()引起所需的副作用,並且在if語句中調用副作用是一個非常糟糕的主意。 –

1

不,Java不會「浪費時間」。它被稱爲short circuit evaluation

這種機制通常例如使用爲空檢查:

if (foo != null && foo.neverFailsWithNPE()) { 
    // ... 
} 
相關問題