Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

try-with-resources 文のclose順序

超いまさらですが、JDK7で導入されたtry-with-resources文のclose順序です。

public class TryWithResources {

    public static void main(String[] args) {
        try (Resource r1 = new Resource("Resouce 1"); Resource r2 = new Resource("Resouce 2");) {
            // なにもしない
        } catch (Exception e) {
            // なにもしない
        } finally {
            System.out.println("finally");
        }
    }

    static class Resource implements AutoCloseable {

        private String name;

        public Resource(String name) {
            this.name = name;
            System.out.println(this.name + " is created.");
        }

        @Override
        public void close() throws Exception {
            System.out.println(this.name + " is closed");
        }
    }

}
Resouce 1 is created.
Resouce 2 is created.
Resouce 2 is closed
Resouce 1 is closed
finally

リソースは、作成した順序の逆順でクローズされます。finally 句は、クローズのあとに実行されます。