2011-07-27 55 views
6

代碼審查工具可能的空指針引用抱怨safeScanWarnings的可能的空指針在saveSafeScan(...)在生產線如果(safeScanWarnings!= NULL & safeScanWarnings.size()> 0 )解釋並修復的

我在想這怎麼可能?這是因爲我們通過參考返回集合嗎?

protected void saveSafeScan(final Response response, final Dtec dtec) throws dtecException 
    { 
     Collection<String> safeScanWarnings = dtec.getSafeScanWarnings(); 
     if (safeScanWarnings!=null && safeScanWarnings.size()>0) 
     { 
      Iterator<String> iterator = safeScanWarnings.iterator(); 

      int i = 0; 
      while (iterator.hasNext()) 
      { 
       String safeScanCode = iterator.next(); 
       if (i == 0) 
       { 
        response.setSafeScanCode(safeScanCode); 
        response.setSafeScanCodeText(getMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", 
          StringUtils.trimToEmpty(safeScanCode)))); 
       } 
       SafeScanWarning safeScan = new SafeScanWarning(); 
       safeScan.setCode(safeScanCode); 
       safeScan.setMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", StringUtils.trimToEmpty(safeScanCode))); 
       safeScan.setPriority(i); 
       response.getSafeScanWarnings().add(safeScan); 
       i++; 
      } 
     } 
    } 
+5

雖然在您的示例代碼是在錯誤正確,如果有一個'&'和沒有'&&'。所以確保在真正的代碼中它是短路評估。如果情況已經如此,這是該工具中的一個錯誤。 – Voo

+0

注意你的代碼示例上面的註釋是'if(safeScanWarnings!= null&safeScanWarnings.size()> 0)'這是錯誤的(錯誤的) – MeBigFatGuy

回答

10

如果它真的指向那一行,它看起來像代碼審查工具中的一個錯誤對我來說。

由於它是一個局部變量,它不會被無效檢查和size()調用之間的任何其他內容所改變 - 所以沒有辦法拋出NullPointerException

0

有一個聲明的分支,如果執行,則保證null值將被取消引用,這將在代碼執行時生成NullPointerException。當然,問題可能是分支或陳述是不可行的,並且不可能拋出NullPointerException。決定超出FindBugs的能力。

0

屬性「分特」應securised:

if (null!=dtec && null!=safeScanWarnings && safeScanWarnings.size()>0) 
    { 
     Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();