2013-09-21 29 views
5

Tôi đang cố tìm lỗi trong mã kế thừa của chúng tôi bằng cách sử dụng findBugs. Trong một phương thức, findBugs đang đưa ra lỗi OBL_UNSATISFIED_OBLIGATION. Tôi đã xác minh rằng tất cả các luồng đều được đóng đúng cách. Dưới đây là đoạn mã:FindBugs OBL_UNSATISFIED_OBLIGATION

FileWriter fw = null; 
FileReader fr = null; 
try { 
    if (!new File(filePath).exists()) { 
     requiredStrings = CommandUtils.invoke(filename); 
     fw = new FileWriter(filePath); 
     fw.write(requiredStrings); 
    } else {    
     StringBuilder sb = new StringBuilder(); 
     fr = new FileReader(filePath); 

     char[] buffer = new char[BLOCK_READ_SIZE]; 
     int bytesRead; 
     while (-1 != (bytesRead = fr.read(buffer, 0, BLOCK_READ_SIZE))) { 
      sb.append(buffer, 0, bytesRead); 
     } 
     requiredStrings = sb.toString(); 
    } 
} finally { 
    if (fw != null) { 
     fw.close(); 
    } 
    if (fr != null) { 
     fr.close(); 
    } 
} 
return requiredStrings; 

Lỗi nói rằng Nghĩa vụ dọn dẹp resurces trong không xả, Path tiếp tục tại .... dòng .... nghĩa vụ còn lại {đọc x 1, Writer x-1 }

+4

Có thể bạn phàn nàn rằng bạn không bắt ngoại lệ từ 'close()' để 'fr' có thể không được để trống nếu' fw.close() 'ném. Ngoài ra, [_ "giả thuyết suy đoán dương tính giả cho mẫu lỗi này chưa được điều chỉnh rộng rãi, do đó, báo cáo về các kết quả dương tính giả là hữu ích đối với chúng tôi." _] (Http://findbugs.sourceforge.net/bugDescriptions.html#OBL_UNSATISFIED_OBLIGATION) –

+0

Xem này: [Java đóng kết nối và FindBugs] [1] [1]: http://stackoverflow.com/questions/4398386/java-closing-connections-and-findbugs – zhaoyuanjie

Trả lời

0

Bạn phải nắm bắt các ngoại lệ IO được ném bởi FileReader và FileWriter khi chúng đóng. Bạn có thể làm điều đó trong Java 7 và trên với try with resources

try (FileWriter fw = new FileWriter(filePath); FileReader fr = new FileReader(filePath)) { 
    /*your code here*/ 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Hoặc bằng cách cũ

FileWriter fw = null; 
    FileReader fr = null; 
    try { 
     /*your code here*/ 
     fw = new FileWriter(filePath); 
     /*your code here*/ 
     fr = new FileReader(filePath); 
     /*your code here*/ 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fw != null) { 
       fw.close(); 
      } 
      if (fr != null) { 
       fr.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

Trong một phương pháp, nó sẽ mở ra một InputStream để đọc, nếu có một cơ hội phương pháp bỏ mà không đóng đối tượng InputStream này, FindBugs sẽ khiếu nại như không dọn sạch java.io.InputStream trên ngoại lệ đã chọn. Ví dụ:

void readProperties() throws FooException{ 
    InputStream is= ... 
    PropertyFactory.getInstance().loadXXXFromPropertyStream(is); // it throws FooException 
    is.close(); // maybe never called for a FooException leaving inputstream is open. 
}