【问题标题】:Method may fail to close stream on exception方法可能无法在异常时关闭流
【发布时间】:2010-04-17 10:21:43
【问题描述】:

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

【问题讨论】:

    标签: java stream findbugs


    【解决方案1】:

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

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

    【讨论】:

    • 你和 findbugs 在技术上是正确的。但是,BufferedReader 构造函数可能失败的唯一方法是使用Error;例如OOME 或 SOE。应用程序不太可能尝试从其中之一中恢复,因此流的泄漏不太重要。
    【解决方案2】:

    BufferedReader 和 InputStreamReader 在关闭时都会关闭底层流。你应该可以关闭stdError

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多