从带有资源的 try catch 中关闭 Finally 块中的资源
Close a resource in a Finally block from a try catch with resources
我的代码中有下一个:
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 {
}
我需要在最后一个块中关闭客户端,但我不能,因为出现错误(无法解析符号客户端)。
有什么办法可以在最后一个区块关闭这个客户端吗?
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
客户端将被关闭,因为你正在使用try-with-resources(当你在try(resource definition)
中打开资源时),它会在try块后自动关闭资源,你不需要写finally块。
我的代码中有下一个:
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 {
}
我需要在最后一个块中关闭客户端,但我不能,因为出现错误(无法解析符号客户端)。
有什么办法可以在最后一个区块关闭这个客户端吗?
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
客户端将被关闭,因为你正在使用try-with-resources(当你在try(resource definition)
中打开资源时),它会在try块后自动关闭资源,你不需要写finally块。