エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【OCPJ】JavaのAutoclose時の例外発生時の動きの勉強

きっかけ

OCPJ11 Goldの勉強をしている際、Autocloseの問題を解いた際に躓いたので、勉強がてら実際にコードを書いて試したので載せる。
ここら辺は、機能追加されたときにしっかり勉強したので大丈夫かと思ったが、間違えたので、結構ショックだった。。。

テストコード

※問題集のコードをそのまま載せると問題だと思ったので、ちょくちょく変えてる。

public class Ocjp3_4 {

    public static void main(String[] args) {

        try(Foo foo = new Foo(); Bar bar = new Bar()) {
            System.out.println("1");
        } catch (Exception e) {
            System.out.println("4");
        }finally {
            System.out.println("5");
        }

    }

    public static class Foo implements AutoCloseable{

        @Override
        public void close() throws Exception {
            System.out.println("3");
        }
    }

    public static class Bar implements AutoCloseable {

        @Override
        public void close() throws Exception {
            System.out.println("2");
            throw new RuntimeException();
        }
    }
}

実行結果

1
2
3
4
5

躓いたところ

Autoclose時に例外が発生した場合、close処理が終了するかと思っていた。。。
なので、自分の期待値としては、1245だった。
回答を見て、よくよく考えたら、Autocloseしない方が問題だから、12345で動かないとダメだと思ったので、実行結果には納得できた。
例外が発生しても、Autocloseが完了するまで例外を一時的にストックしているのだという理解でいる。

close順は、定義順の逆順だったのは知っていたので、そこには引っかからなかった。