2013-09-21 17 views
5

findBugsを使用して従来のコードでバグを見つけようとしています。 1つのメソッドでは、findBugsがOBL_UNSATISFIED_OBLIGATIONエラーを出しています。すべてのストリームが正しく閉じられていることを確認しました。ここでは、コードスニペットです: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; 

エラーが排出されないで義務resurcesをクリーンアップすることを言いますが、パスが....ライン.... 残りの義務{リーダー×1、ライターのX-1に続きます。 }

+4

'fw.close()'がスローすると、 'fr'が閉じられないように' close() 'から例外をキャッチしないことがあるかもしれません。また、[_ "このバグパターンの偽陽性抑制ヒューリスティックは広範囲に調整されていないため、偽陽性に関する報告は役に立ちます。"](http://findbugs.sourceforge.net/bugDescriptions.html#OBL_UNSATISFIED_OBLIGATION ) –

+0

これを見る:[Javaの閉鎖接続とFindBugsの] [1] [1]:http://stackoverflow.com/questions/4398386/java-closing-connections-and-findbugs – zhaoyuanjie

答えて

0

FileReaderとFileWriterがスローするIO例外をクローズしたときにそれらをキャッチする必要があります。あなたはこの方法が終了する可能性がある場合は、Javaの7にし、 方法で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(); 
    } 

それとも

古い方法によって
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

とアッパーそれは、読書のためのInputStreamを開くことを行うことができますこのInputStreamオブジェクトを閉じることなくFindBugsは、チェックされた例外でjava.io.InputStreamをクリーンアップするのに失敗したように文句を言うでしょう。例えば、: