17

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

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

唉,这会导致语法错误(神秘地期待 a ;)。将类型定义/声明移动到try语句中是可行的,这当然会将事物移动到相应的范围内。AutoClosable当我想要更多而不是关闭时,我可以弄清楚如何解决这个问题,我对编译器为什么需要它感兴趣。

4

3 回答 3

11

Java 9开始,您可以在块外的try-with-resources中声明和初始化使用的变量。对 variable 的唯一额外要求是它必须是有效的 final
所以现在可以这样做:

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

希望能帮助到你。

于 2017-10-29T07:11:56.977 回答
7

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

CloseableResource thing;
Parameter a;

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

如果你写了怎么办

try (12) {

或者其他的东西?

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

try(thing1) {
}

为什么只关闭thing1

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

ALSO2

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

thing1.doSomethingOnClosedResource();

因为thing1仍然存在。

于 2012-12-12T09:24:52.833 回答
2

阅读java规范我得出了这个结论(尽管它没有隐含地表明是这样):

它们使您声明变量并为其添加隐式 final 以确保您不能将变量重新绑定到其他东西。

在这种情况下,将不可能关闭资源,因为它不再绑定到变量。

例如:

CloseableResource thing;
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) {
    thing = null;
    // thing can't be closed now
}

如果我猜它在外面,他们可以让你使用 final 但它有点难看。


finally解决方法:如果要访问声明的资源,可以使用:

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

请记住,finallything已经关闭

于 2012-12-12T09:31:00.403 回答