gpt4 book ai didi

java - 如何仅使用 try-catch-finally 构造用两个资源重写 try-with-resources?

转载 作者:行者123 更新时间:2023-11-30 07:50:05 25 4
gpt4 key购买 nike

如何改写下面的代码

try (A a = new A(); B b = new B()) {
//useful work here
}
catch (Exception e) {
//other code
}

使用 try-catch-finally 构造?

如果我们只创建一个资源,则有一个很好的链接 here .

不幸的是,当我们创建多个资源时,我不明白如何概括这一点。

我不明白的一件事是我们如何识别发生在 a 而没有发生在 'b' 上的事情,反之亦然。

最佳答案

没有通用规则,但您必须确保尝试关闭所有打开的资源,即使您不知道发生了什么以及在哪个资源中也是如此。

 void test() throws Exception {
A a = null;
B b = null;

Exception myException = null;
try {
a = new A();
b = new B();
//useful work here
} catch (Exception e) {
myException = e;
throw e;
} finally {
Throwable tA = handleCloaseable(a);
Throwable tB = handleCloaseable(b);

boolean throwIt = false;
if (myException == null && tA != null || tB != null) {
myException = new Exception();
throwIt = true;
}

if (tA != null) {
myException.addSuppressed(tA);
}
if (tB != null) {
myException.addSuppressed(tB);
}

if (throwIt) {
throw myException;
}
}
}

Throwable handleCloaseable(AutoCloseable e){ // your resources must implements AutoCloseable or Closeable
if (e != null) {
try {
e.close();
} catch (Throwable t) {
return t;
}
}
return null;
}

如果在您尝试关闭资源时发生任何异常,则创建新的 Exception(如果不存在)并在您尝试使用 addSuppressed 关闭时添加异常

关于java - 如何仅使用 try-catch-finally 构造用两个资源重写 try-with-resources?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47964866/

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