Why is declaration required in Java's try-with-resource

java, try-catch

Solution

Your version does not clearly define what should be closed, for example

CloseableResource thing;
Parameter a;

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

also what to do if you write

try (12) {

or something?

ALSO

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

try(thing1) {
}

why only close `thing1`?

So the current syntax force you to create a variable simultaneosly with opening close block.

ALSO2

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

thing1.doSomethingOnClosedResource();

since `thing1` remains.

Problem

Java7's try-with-resources is great and all, but I can't wrap my head around why it is required to include the declaration of the resource in the `try` statement. My gut says the following should be possible: ``` CloseableResource thing; try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) { // do some interesting things } thing.collectSomeStats(); ``` Alas, this results in a syntax error (cryptically expecting a `;`). Moving the type definition/declaration into the `try` statement works, which of course moves thing into the corresponding scope. I can figure out how to work around this when I want more from my `AutoClosable` than getting closed, I'm interested in why the compiler requires it like this.

Original source

Related problems