gpt4 book ai didi

java - 在一个 try 语句中打开多个资源不可靠吗?为什么?

转载 作者:行者123 更新时间:2023-12-01 06:03:33 24 4
gpt4 key购买 nike

这个程序:

import java.util.*;

public class Main {

static Set<String> openResources = new TreeSet<>();

static class MyResource implements AutoCloseable {

boolean close;
MyResource encapsulatedResource;
String name;

MyResource(String id, boolean exceptionOnCreate, boolean exceptionOnClose, MyResource encapsulatedResource) {
this.close = exceptionOnClose;
this.encapsulatedResource = encapsulatedResource;
this.name = id;
if (exceptionOnCreate) {
throw new RuntimeException("Exception when creating " + id);
}
openResources.add(id);
System.out.println(name + " is now open");
}

@Override
public void close() {
if (close) {
throw new RuntimeException("Exception when closing " + name);
}
if (encapsulatedResource != null) {
encapsulatedResource.close();
}
openResources.remove(name);
System.out.println(name + " was successfully closed");
}

}

public static void main(String[] args) {
try (AutoCloseable resource1 = new MyResource("resource1", false, false, null);
MyResource resource2 = new MyResource("resource2", false, true, null);
AutoCloseable resource3 = new MyResource("resource3", false, false, resource2);
AutoCloseable resource4 = new MyResource("resource4", true, false, null);) {
System.out.println("main program");
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("openResources: " + openResources);
}
}

有以下输出:

resource1 is now open
resource2 is now open
resource3 is now open
resource1 was successfully closed
Exception when creating resource4
openResources: [resource2, resource3]

我期望当使用 try-with-resources 时,所有资源都被正确关闭,并且我不会有任何泄漏。然而,这里资源2和3被泄露了。为什么?我不能依赖该语法吗?

最佳答案

由于异常的定义方式,资源 2 和 3 被“泄漏”。由于资源 4 在创建时抛出异常,因此创建的资源将被关闭。资源 3 将尝试关闭,但由于它实际上正在尝试关闭资源 2,因此资源 3 将引发异常(注意:此异常被抑制,因为它是在为 try 部分中的原始异常提供服务时引发的)。关闭资源 2 也会导致抑制异常,从而使资源 1 成为唯一已关闭的资源。

关于java - 在一个 try 语句中打开多个资源不可靠吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51248575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com