[英]Proper way to close an AutoCloseable
关闭OutputStream
、 ServerSocket
或其他实现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.