2012-07-03 91 views
4

我不知道爲什麼日食警告我「死代碼」在我這個代碼:死代碼警告在IF語句

PreparedStatement p = conn.prepareStatement("SELECT name FROM user WHERE age = ? , city = ?"); 
    p.setInt(1, (String) parameters.get("age")); 
    p.setString(2, (String) parameters.get("city")); 

    if (p == null) { 
     log.warn("User is not available"); 
     return results; 
    } 

的警告是在日誌中,有誰能夠告訴我這樣做的原因?謝謝。

回答

9

p不能null在這一點上,只是因爲你已經在p稱爲setIntsetString,如果它是null那裏,那麼它會拋出一個NullPointerException,從而達到永不您if

另請注意,根據its documentationpreparedStatement永遠不能返回null。它只能返回一個有效的語句或拋出異常。在後一種情況下,您的if無法到達。然而,這個事實是而不是由編譯器檢查(因爲中斷執行prepareStatement可能理論上返回null)。

+0

+1好的細節.. –

-1

如果pnull那麼在第二行本身就會出現`NullPointerException'。

變化像下面

PreparedStatement p = conn.prepareStatement("SELECT name FROM user WHERE age = ? , city = ?"); 
if(p != null){ 
    p.setInt(1, (String) parameters.get("age")); 
    p.setString(2, (String) parameters.get("city")); 
}else{ 
    log.warn("User is not available"); 
    return results; 
} 

或代碼中使用p

PreparedStatement p = conn.prepareStatement("SELECT name FROM user WHERE age = ? , city = ?"); 
if (p == null) { 
    log.warn("User is not available"); 
    return results; 
} 
p.setInt(1, (String) parameters.get("age")); 
p.setString(2, (String) parameters.get("city")); 
+2

我不鼓勵在這裏使用'null'檢查,因爲'prepareStatement'被記錄爲不返回'null'。如果你想要錯誤處理,你應該捕獲'SQLException'並處理它。 –

+0

好的信息..感謝兄弟.. –

+0

是的,謝謝你的所有意見。現在我明白了。 IF語句永遠不會被達到,因爲如果p爲null(儘管它不會,基於文檔),它將在獲得IF語句之前返回一個Exception。如果p不爲空,那麼IF語句將永遠不會運行。 – Eaton

0

你需要做的,你之前null檢查調用任何方法對p前將if loop。如果p是null,它永遠不會到達那條線。