为什么在 Java 的 try-with-resource 中需要声明

2022-09-03 01:43:43

Java7 的 try-with-resources 很棒,但是我无法理解为什么需要在语句中包含资源的声明。我的直觉告诉我,以下情况应该是可能的:try

CloseableResource thing;
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) {
    // do some interesting things
}
thing.collectSomeStats();

唉,这会导致语法错误(隐晦地期望一个)。将类型定义/声明移动到语句中是有效的,这当然会将事情移动到相应的范围中。我可以弄清楚如何解决这个问题,当我想要从我的更多而不是关闭时,我对为什么编译器需要这样感兴趣。;tryAutoClosable


答案 1

Java 9 开始,您可以声明和初始化在块外部的 try-with-resources 内部使用的变量。变量的唯一附加要求是它必须是有效的最终结果
所以现在有可能做到:

CloseableResource thing = methodThatCreatesAThingAndDoesSomeSideEffect();
try (thing) {
    // do some interesting things
}
thing.collectSomeStats();

希望它有帮助。


答案 2

您的版本没有明确定义应该关闭的内容,例如

CloseableResource thing;
Parameter a;

try (a = (thing = methodThatCreatesAThingAndDoesSomeSideEffect()).getParameter()) {

如果你写,也该怎么办

try (12) {

还是别的什么?

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();
CloseableResource thing2 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

为什么只关闭?thing1

因此,当前的语法迫使您同时创建一个变量,同时打开关闭块。

另外2

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

thing1.doSomethingOnClosedResource();

因为仍然存在。thing1


推荐