繁体   English   中英

关闭 AutoCloseable 的正确方法

[英]Proper way to close an AutoCloseable

关闭OutputStreamServerSocket或其他实现AutoCloseable接口的对象时要遵循的最可靠模式是什么?

我应该使用try - catch - finally吗? 或者关闭钩子。

使用AutoCloseable实例的正确方法是使用try -with-resources块,因此即使抛出异常,资源也会可靠地关闭

像这样:

    try (OutputStream stream = new ...) {
       ... // use the resource
    } catch (IOException e) {
        ... // exception handling code
    }

您还可以使用一个块(而不是嵌套块)控制多个资源

try (
     OutputStream out1 = ...;
     OutputStream out2 = ...;
     InputStream in1 = ...;
     InputStream in2 = ...;
) {
     ...
}

不要使用try ... finally:对于某些边缘情况(需要抑制异常的情况),这将导致行为不端。

不要使用关闭钩子:资源很少是真正全局的,这种方法很容易出现竞争风险。 try -with-resources 是正确关闭所有AutoCloseable资源的推荐方式:两者是同时引入 Java 的,因此它们可以一起工作。

这样做隐式地有助于实现(推荐的)规则,即只有负责创建或打开某物的代码负责处理或关闭它:如果一个方法被传递了一个OutputStream ,它永远不应该close()它。 它应该依赖于调用者关闭它。 如果您的任何方法都没有显式调用close() ,则保证您的代码永远不会抛出异常(例如“套接字已关闭” java.net.SocketException ),因为它尝试使用已关闭的资源。

这样做可确保资源恰好关闭一次。 请注意,通常多次关闭AutoCloseable是不安全的:不能保证close()操作是幂等的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM