私には3つの質問があります。Callable.call内で閉じられないBufferedReaderはどうなりますか?
説明すると、私は誰かのコードを見直していて、BufferedReader
が閉じられていないことがあることに気づいた。通常、Eclipseは潜在的なメモリリークであるとの警告を出します(そして私はそれを修正します)。ただし、Callable内部クラス内には警告はありません。
class outerClass {
...
public void someMethod() {
Future<Integer> future = outputThreadPool.submit(new innerClass(this.myProcess.getInputStream(), threadName));
...
}
class innerClass implements Callable<Integer> {
private final InputStream stream;
private final String prepend;
innerClass(InputStream stream, String prepend) {
this.stream = stream;
this.prepend = prepend;
}
@Override
public Integer call() {
BufferedReader stdOut = new BufferedReader(new InputStreamReader(stream));
String output = null;
try {
while ((output = stdOut.readLine()) != null) {
log.info("[" + prepend + "] " + output);
}
} catch (IOException ignore) {
// I have no idea why we're ignoring this... :-|
}
return 0;
}
}
}
コードを書いた人は、Java開発者を経験しているので、私の最初に考えたのは、それが意図的であるということです...しかし、彼らはそれを書き、それを見落としたときに、それは彼らが急いでいたことができました。
私の質問は以下のとおりです。
なぜEclipseは(次の質問への答えによって回答されてもよい)、これをハイライト表示されませんか?
call()メソッド内で閉じられた場合に起こりうる最悪のことは何ですか? (私は正当な理由は考えられません...しばらく探していましたが、BufferedReaderを閉じないように意図的に考えていたかもしれません)
BufferedReaderはではないは内部クラス内で閉じられていますか?
はない警告にフラグを立てることは、より私は互いに矛盾するように見えるカップルの答えを持っている –
「それはこの場合には、それを行うには大丈夫です」と言うために意識的な決定よりも、Eclipseのバグのように聞こえます。一方で、BufferedReaderを閉じなければならないという人もいます。一方、彼らはそれを閉じても、それを閉じてInputStreamを閉じてしまうので、呼び出すクラスはそれを必要とするかもしれないと言います... – GLaDOS
[この質問を見る](http://stackoverflow.com/questions/) 1388602/do-i-need-to-close-both-filereader-and-bufferedreader)を参照してください。 'InputStream'のようなリソースがメソッドに渡されている場合、他の誰かがそれを開いたことを意味します。他の誰かがそれを閉じなければなりません。彼らがあなたのメソッドにストリームを渡した後に、別の場所でそれを使用しようとすると、あなたのメソッドが(バッファの読み込みを中断して)ストリーム。 – Brian