方法可能无法在异常时关闭流

时间:2010-04-17 10:21:43

标签: java stream findbugs

我发现了一个关于findbugs的严重错误:

  

该方法创建一个IO流对象,不将其分配给任何字段,将其传递给其他方法或返回它,并且似乎不会在方法之外的所有可能的异常路径上关闭它。这可能导致文件描述符泄漏。通常最好使用finally块来确保流关闭。

try {
...
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
...
} catch (IOException e) {
    throw new RuntimeException(e);
} finally {
    try {
        if (stdError != null) {
            stdError.close();
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

我还需要关闭InputStreamReader还是p.getErrorStream(它会返回InputStream)?

2 个答案:

答案 0 :(得分:5)

创建BufferedReader对象时抛出异常会发生什么?由InputStreamReader对象管理的流在垃圾收集器决定销毁对象的某个时间之前不会关闭。

如果在创建InputStreamReader对象时抛出异常,您可能会遇到类似的问题。

答案 1 :(得分:4)

BufferedReader和InputStreamReader在关闭时关闭底层流。关闭stdError

你应该没问题