首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关闭AutoCloseable的正确方法

关闭AutoCloseable的正确方法
EN

Stack Overflow用户
提问于 2019-05-13 12:41:20
回答 1查看 5.7K关注 0票数 5

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-13 12:41:20

使用AutoCloseable实例的正确方法是使用-有-资源块,因此即使抛出异常,资源也是可靠的关着的不营业的

如下所示:

代码语言:javascript
运行
复制
    try (OutputStream stream = new ...) {
       ... // use the resource
    } catch (IOException e) {
        ... // exception handling code
    }

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

代码语言:javascript
运行
复制
try (
     OutputStream out1 = ...;
     OutputStream out2 = ...;
     InputStream in1 = ...;
     InputStream in2 = ...;
) {
     ...
}

区块:对于某些边缘情况(需要抑制异常的情况),这会导致错误行为。

不要使用关闭钩子:资源很少是真正的全局,而且这种方法很容易产生种族风险。try-with是正确关闭all AutoCloseable资源的推荐方法:这两种资源同时引入Java,以便它们能够协同工作。

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

这样做可以确保资源精确地关闭一次。请注意,通常关闭一个AutoCloseable不止一次是不安全的:close()操作是,而不是,保证是幂等的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56112598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档