1 回答
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()操作是幂等的。
添加回答
举报