きっかけ
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順は、定義順の逆順だったのは知っていたので、そこには引っかからなかった。