2011-08-24 22 views
0

我對Java編程並不陌生,但這個問題對我來說是前所未聞的。 我有這樣的代碼:帶有多個return語句的函數在if子句中的行爲不像預期的那樣?

private static boolean isEarlierThanAndNotReminded(Callback left, Callback right) {  
if(right == null) { 
      return !left.isReminded(); 
     } 
     else { 
      return !left.isReminded() && (left.getAlertStart().before(right.getAlertStart())); 
} 
} 

好了,所以問題是,我得到了「其他」條款中有個空指針的報告。 當我調試時,我可以看到right實際上是空的,但仍然執行陸地第一次在if-子句,然後控制繼續到「else」 - 它得到一個空指針。 我對我在這裏想念的東西毫無頭緒,有什麼建議嗎?

+1

回到你的舊問題並接受一些答案。這會讓更多的人想要用新的問題來幫助你。它還可以幫助他人找到問題的答案! – Blundell

回答

2

它可能只是編譯器優化和調試器處理它的方式的函數。 這是'如果'的第一個條件,但沒有實際執行回報。如果你仔細想想,無論 'right'的值是代碼需要知道'!left.isReminded()'的值,所以這個語句必須被執行。我敢打賭,如果你有

boolean leftRemindedValue = left.isReminded(); 

開始你的函數的if語句之前,然後把沒有新的布爾到您的return語句,你會看到在調試器不同的執行路徑。

2

那是一個有點混淆了。如果聲明,我可能沒有你的邏輯正確的,但這應該更有意義,您:

private static boolean isEarlierThanAndNotReminded(Callback left, Callback right) {  
    if(right != null) { 
     return !right.isReminded(); 
    } else { 
     return !left.isReminded(); 
    } 

}

你想檢查權ISN」 t null,如果不是這意味着你有一個'正確的'回調,所以使用正確的對象,否則你會認爲你有一個左回調並使用它。

這段代碼:

&& (left.getAlertStart().before(right.getAlertStart()) 

需要您檢查左,右null檢查:

if(left != null && right != null){ 
    return (left.getAlertStart().before(right.getAlertStart()); 
} 

所以,如果我有這個權利,你最終會得到:

private static boolean isEarlierThanAndNotReminded(Callback left, Callback right) {  
    boolean returnVal = false; 
    if(right != null) { 
     returnVal = !right.isReminded(); 
    } else if (left != null){ 
     returnVal = !left.isReminded(); 
    } 
    if(left != null && right != null){ 
     returnVal = returnVal && (left.getAlertStart().before(right.getAlertStart()); 
    } 
    return returnVal; 
} 
+0

如果'right'和'left'爲空,這將在第6行失敗。 – Cephalopod

+0

@Arian修復它。雖然原始海報假設如果權利是空的,左邊不可能是空的。 – Blundell

+0

這是真的,但我想這正是這個問題。 – Cephalopod

1

right不是唯一的參考,它可以是null條款else條款。 left.getAlertStart()也可能是null - 這可能是導致異常的原因。

+0

我同意,但如果「正確」爲空,則不應該輸入else子句。 – AndersG

相關問題