2014-02-10 53 views
1

我正在開發Android版應用。在我的代碼中,我有以下幾行:if-else condition:AND評估之謎

if (shape != null && !created && isTap(touchDown, event)) { 
    DrawPrimitive newShape = listener.onTouch(event, shape); 
    if (newShape != shape) 
     canvas.onDrawingChanged(true); 
} 

created是一個布爾成員。我想知道,因爲創建是真實的,但即使沒有調用isTap方法,運行時步入我的。如果我改變了!到錯誤的比較,一切工作正常。

if (shape != null && created == false && isTap(touchDown, event)) { 
    DrawPrimitive newShape = listener.onTouch(event, shape); 
    if (newShape != shape) 
     canvas.onDrawingChanged(true); 
} 

所以我想知道如果!不允許。但即使如此,爲什麼我的isTap方法(在版本一中)不被調用,爲什麼內部代碼在沒有評估所有AND條件的情況下執行。

+0

你是如何檢查它是否被調用的? –

+0

嘗試將您的代碼更改回第一個版本並運行它。我敢打賭它會正常工作。 – zmbq

+0

我是如何檢查的?當然通過調試。 – Matthias

回答

0

!createdcreated == false是等同的。第一個版本的行爲應與第二個版本的行爲完全相同。

+0

實際的問題是我的創建成員是布爾型(java.lang)而不是小寫布爾值。 – Matthias

+0

啊對了,那麼是的,在那種情況下,對象布爾值不會遵循相同的等式和'!'一元字符 – SDJMcHattie

2

爲什麼isTap()不叫:&&連詞(和||析取的這個問題)與評價短路從左至右:當表達的左手側的操作數的計算結果爲falsetrue||),右邊的操作數不需要評估:表達式的值是已知的。

!createdcreated == false是相同的在Java中,如果createdboolean。如果是Boolean,你將有自動裝箱/拆箱問題:

  • !created autounboxes的Booleanboolean!結果補充。

  • created == false autoboxes false布爾文字爲Boolean並比較對象引用。它們不一定是相同的對象。

爲了避免這樣的問題,並作爲一個經驗法則,不要在布爾表達式中使用truefalse直接。

+1

但它不應該跳到我的內部代碼中,因爲在第二種情況下整個條件是錯誤的。 – Matthias

+1

你怎麼知道?有問題的評論你說「調試」,但調試器可以通過看似跳到不執行的行來混淆你。您可以使用日誌記錄以獲得更加清晰 – laalto