【发布时间】:2021-05-13 05:11:41
【问题描述】:
从 Java 9 开始,我们可以在 try-with-resources 中有效地使用最终变量。
下面的示例展示了其中一个资源初始化引发异常的情况。
public static void main(String[] args) {
Resource1 r1 = new Resource1();
Resource2 r2 = new Resource2(); // exception will be thrown
try (r1; r2) {
System.out.println("TryWithResources.main() try");
} catch (Exception e) {
System.out.println("TryWithResources.main() catch");
}
}
static class Resource1 implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("TryWithResources.Resource1.close()");
}
}
static class Resource2 implements AutoCloseable {
public Resource2() {
throw new RuntimeException();
}
@Override
public void close() throws Exception {
System.out.println("TryWithResources.Resource2.close()");
}
}
当我运行这个示例时,我得到的唯一输出是 RuntimeException,这意味着 Resource1 没有关闭。这是意料之中的,因为它没有在 try-with-resources 中初始化。
但是,这是预期的结果,还是我错过了什么?
因为,如果这实际上是它应该工作的方式,那么在我看来,这种新语法实际上消除了许多最初由 try-with-resources 语句带来的安全性。
有人可以确认是否真的是这样吗? 而且,如果是肯定的,我们为什么要在多个资源中使用这种语法并冒这个风险?
【问题讨论】:
标签: java java-9 try-with-resources autocloseable