2011-07-27 23 views
6
công cụ rà soát

Mã được phàn nàn thể rỗng trỏ dereference của safeScanWarnings trong saveSafeScan (...) Tại dòng if (safeScanWarnings! = Null & safeScanWarnings.size()> 0)Giải thích và sửa chữa cho có thể dereference con trỏ null của

Tôi tự hỏi làm thế nào điều này có thể? Đây có phải là vì chúng tôi đang trả lại bộ sưu tập bằng cách tham chiếu không?

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

Trong khi trong ví dụ của bạn mã là đúng do lỗi của bạn nếu có một '&' và không '&& '. Vì vậy, hãy chắc chắn rằng trong mã thực sự đó là đánh giá shortcircuit. Nếu đó là trường hợp đó là một lỗi trong công cụ. – Voo

+0

nhận thấy nhận xét của bạn ở trên mẫu mã là 'if (safeScanWarnings! = Null & safeScanWarnings.size()> 0)' đó là sai (lỗi) – MeBigFatGuy

Trả lời

10

Nếu nó thực sự trỏ đến dòng đó, có vẻ như lỗi trong công cụ đánh giá mã cho tôi.

Vì đây là biến cục bộ nên sẽ không có thay đổi nào xảy ra giữa kiểm tra vô hiệu và cuộc gọi size() - vì vậy không có cách nào nó sẽ ném NullPointerException.

0

Có một chi nhánh của câu lệnh, nếu được thực hiện, đảm bảo rằng giá trị null sẽ bị hủy đăng ký, sẽ tạo ra một NullPointerException khi mã được thực thi. Tất nhiên, vấn đề có thể là các chi nhánh hoặc tuyên bố là không khả thi và rằng NullPointerException không bao giờ có thể được ném. Quyết định vượt quá khả năng của FindBugs.

0

Thuộc tính "DTEC" nên được securised:

if (null!=dtec && null!=safeScanWarnings && safeScanWarnings.size()>0) 
    { 
     Collection<String> safeScanWarnings = dtec.getSafeScanWarnings(); 
Các vấn đề liên quan