djechlin
djechlin

Reputation: 60768

Are resources closed before or after the finally?

In Java 7's try-with-resources, I don't know which order the finally block and the auto-closing happens. What's the order?

BaseResource b = new BaseResource(); // not auto-closeable; must be stop'ed
try(AdvancedResource a = new AdvancedResource(b)) {

}
finally {
    b.stop(); // will this happen before or after a.close()?
}

Upvotes: 44

Views: 6974

Answers (2)

Roland
Roland

Reputation: 7853

According to the JLS 13; 14.20.3.2. Extended try-with-resources

The finally block is the last to be executed:

Furthermore, all resources will have been closed (or attempted to be closed) by the time the finally block is executed, in keeping with the intent of the finally keyword.

Upvotes: 1

Jigar Joshi
Jigar Joshi

Reputation: 240898

The resource gets closed before catch or finally blocks. See this tutorial.

A try-with-resources statement can have catch and finally blocks just like an ordinary try statement. In a try-with-resources statement, any catch or finally block is run after the resources declared have been closed.

To evaluate this is a sample code:

class ClosableDummy implements Closeable {
    public void close() {
        System.out.println("closing");
    }
}

public class ClosableDemo {
    public static void main(String[] args) {
        try (ClosableDummy closableDummy = new ClosableDummy()) {
            System.out.println("try exit");
            throw new Exception();
        } catch (Exception ex) {
            System.out.println("catch");
        } finally {
            System.out.println("finally");
        }


    }
}

Output:

try exit
closing
catch
finally

Upvotes: 66

Related Questions