为了账号安全,请及时绑定邮箱和手机立即绑定

正确的方法来关闭一个自动关闭

正确的方法来关闭一个自动关闭

慕标5832272 2019-11-04 14:05:57
什么是最可靠的模式关闭的时候跟随OutputStream,ServerSocket实现了或其他对象AutoCloseable的接口?我应该使用try- - ?catch finally或关闭钩子。
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

使用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(),则可以保证您的代码永远不会引发异常(例如“ Socket close”java.net.SocketException),因为它尝试使用已关闭的资源。


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


查看完整回答
反对 回复 2019-11-04
  • 1 回答
  • 0 关注
  • 368 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信