try〜finallyの中にSystem#exit書いた場合ってfinallyは呼ばれるのかね。
結論から言うと、以下のテストケースを流せばわかるのですが、呼ばれません。*1
@Test public void testname() throws Exception { try { System.exit(0); } finally { System.out.println("終了ー"); fail(); } }
さらに、id:kompiroさんからも以下のような情報提供をいただきました!
@setoazusa finally節で呼ばれないみたいですけど、この辺参考にできないですか?http://www.compeople.eu/blog/?p=412
これを参考に、先ほどのテストケースを以下のように書き換えると、
public class ExitTest { @Before public void setup() { System.setSecurityManager(new TestSecurityManager()); } @Test public void testname() throws Exception { try { System.exit(-1); } finally { System.out.println("終了ー"); } } public static class TestSecurityManager extends SecurityManager { @Override public void checkExit( final int status ) { assertThat(status, is(0)); } @Override public void checkPermission( final Permission perm ) { } @Override public void checkPermission( final Permission perm, final Object context ) { } } }
以下のような結果に。
これを使えばバッチ処理の終了時に処理を挟み込んだり、返り値のassertができたりしますね。あと例外を投げてexitをキャンセルするいたずらにも使えますね^^;覚えておいて損はなさそうです。