【问题标题】:Close a resource in a Finally block from a try catch with resources通过资源的 try catch 关闭 finally 块中的资源
【发布时间】:2021-11-26 00:25:10
【问题描述】:

我的代码中有下一个:

try (DockerClient client = DefaultDockerClient.fromEnv().connectTimeoutMillis(TimeUnit.SECONDS.toMillis(3)).build()) {
    //some code here
}catch (DockerCertificateException e) {
    log.warn("Failed to connect Docker Client {}", e.getMessage());
}
finally {

}

我需要在最后一个块中关闭客户端,但我不能,因为我收到错误消息(无法解析符号客户端)。

有什么办法可以在最后一个区块关闭这个客户端?

【问题讨论】:

  • 如果使用资源尝试,为什么需要在 finally 块中关闭它?
  • 因为代码里面可能有一些异常,所以我在main try里面使用的是client,但是我需要在整个过程结束时关闭连接。
  • @YuCheng 请将其作为答案发布并删除评论。

标签: java try-catch-finally


【解决方案1】:

try(...) 中的对象必须实现AutoClosable,并且无论是否发生异常,该对象都会自动关闭。你根本不需要 finally 块。

如果对象没有实现AutoClosable,你可以回退到旧的try-catch-finally块

DockerClient client = null;
try {
  //some code here
  client = DefaultDockerClient.fromEnv().connectTimeoutMillis(TimeUnit.SECONDS.toMillis(3)).build();
} catch (DockerCertificateException e) {
  log.warn("Failed to connect Docker Client {}", e.getMessage());
} finally {
  if (client != null) client.close();        
}

这称为 Java try-with-resources 块。您可以在此处看到一个将普通 try-catch-finally 块与 try-with-resources 块进行比较的示例:https://www.baeldung.com/java-try-with-resources#replacing

【讨论】:

  • 对象来自库,你的意思是我必须创建一个继承自 DockerClient 并实现可关闭的包装器吗?或类似的东西?
  • 您可以这样做,但我建议您只需使用旧的 try-catch-finally 块,如我编辑的答案所示。
【解决方案2】:

客户端将被关闭,因为您使用的是try-with-resources(当您在try(resource definition)中打开资源时),它会在try块后自动关闭资源,您不需要编写finally块。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多