2013-09-21 6 views
5

Próbuję znaleźć błędy w naszym dotychczasowym kodzie za pomocą findBugs. W jednej z metod findBugs podaje błąd OBL_UNSATISFIED_OBLIGATION. Sprawdziłem, czy wszystkie strumienie są poprawnie zamknięte. Oto fragment kodu: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; 

Błąd mówi, że Obowiązek oczyścić resurces w nie rozładowany, ścieżka nadal na linii .... .... pozostałych zobowiązań {Reader x 1, x-1 Writer }

+4

Być może narzeka, że ​​nie przechwytujesz wyjątków od 'close()', więc 'fr' może pozostać niezamknięty, jeśli' fw.close() 'wyrzuci. Ponadto, [_ "heurystyki fałszywie dodatnie dla tego wzorca błędu nie zostały dokładnie dostrojone, więc raporty dotyczące fałszywych alarmów są dla nas pomocne." _] (Http://findbugs.sourceforge.net/bugDescriptions.html#OBL_UNSATISFIED_OBLIGATION) –

+0

Zobacz to: [Java zamykania połączeń i findbugs] [1] [1]: http://stackoverflow.com/questions/4398386/java-closing-connections-and-findbugs – zhaoyuanjie

Odpowiedz

0

Musisz przechwytywać wyjątki IO wyrzucane przez FileReader i FileWriter podczas zamykania. Można to zrobić w Java 7 i górna z 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(); 
    } 

Lub po staremu

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

W sposobie, otwiera InputStream do czytania, jeśli jest szansa metoda zamykany bez zamykania tego obiektu InputStream, FindBugs narzekałby, że nie udało się wyczyścić java.io.InputStream na sprawdzonym wyjątku. Na przykład:

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. 
}