【问题标题】:Do i need to handle or ignore the IOException fired by OutputStream close() function?我需要处理或忽略由 OutputStream close() 函数触发的 IOException 吗?
【发布时间】:2012-01-20 09:33:51
【问题描述】:

在下面的代码中,outPutStream 的关闭函数会抛出一个我应该捕获的 IOException 异常。我的问题是我需要处理它吗?由于我正在使用移动设备,并且我想确保释放我使用的所有资源,或者我可以安全地忽略异常。

//...
OutputStream output = null;
try {
     output = connection.getOutputStream();
     output.write(query.getBytes(charset));
} finally {
     if (output != null) try { 
        output.close(); 
     } catch (IOException e) {
        // Do i need to do something here ?
     }
}

【问题讨论】:

  • 你永远不应该忽略可能抛出的异常,看看 Java 7 中新增的 Try-With 资源块,它可能会让这段代码看起来更漂亮:docs.oracle.com/javase/tutorial/essential/exceptions/…
  • 你能用它做什么?
  • 是的,那个总是让我摸不着头脑。我总是做的只是记录错误,这样如果它发生了,我就知道它确实发生了——但我不知道在这种情况下需要做什么才能恢复(如果有的话)。
  • Hunter McMillen:但是您推荐的 try-with-resources 块可能会产生忽略 Jimmy 询问如何处理的异常的效果。阅读您的链接对“抑制”异常的讨论。

标签: java io outputstream


【解决方案1】:

如果关闭不起作用,你能做什么?

您唯一能做的就是记录异常,正如@mprabhat 建议的那样,您可以将引用设置为 null 以加快 GC。

【讨论】:

  • 调用 flush() 有意义吗?否则无法执行。
  • 我认为这也会抛出 IOException
  • 我认为它没有意义,稍微阅读关闭后会先调用flush。
  • 在我上面的评论中,我假设我们处于您的 close() 已经抛出异常的情况。
  • 对不起,我不是指您的评论。我说的是我的第一个假设。感谢您的跟进。
【解决方案2】:

在最坏的情况下,您可以发出警告。但通常,在尝试关闭已经关闭的会话时会引发此类异常。在这种情况下,您无需执行任何操作。

【讨论】:

    【解决方案3】:

    Java 文档没有详细说明哪些不同的条件关闭会引发IOException,因此无能为力。

    至少你可以将OutputStream的引用设置为null并记录异常。

    【讨论】:

      【解决方案4】:

      在 Effective Java Joshua Bloch 中提到这是您可能想要忽略的异常之一。他说,一般来说,您确实希望对异常做更多的事情,而不仅仅是记录它们。

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 1970-01-01
        • 2014-12-26
        • 2011-02-23
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 2021-03-31
        • 2017-09-30
        相关资源
        最近更新 更多