7

我收到一个关于 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)?

4

2 回答 2

5

BufferedReader在创建对象时抛出异常会发生什么?由对象管理的流InputStreamReader直到将来垃圾收集器决定销毁对象时才会关闭。

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

于 2010-04-17T10:32:32.547 回答
4

BufferedReader 和 InputStreamReader 在关闭时都会关闭底层流。关闭应该没问题stdError

于 2010-04-17T10:27:50.803 回答