我有三个问题。
为了解释,我正在审查某人的代码,并注意到BufferedReader
s 有时没有被关闭。通常,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没有在内部类中关闭,可能发生的最坏情况是什么?