🎉

Java finally 句の例外処理

2023/03/19に公開

Java の finally 句で例外が発生すると、元々の例外を上書きしてしまう。

サンプルプログラム

class HelloWorld {
    public static void main(String[] args) {
        try {
            try {
                throw new Exception("Exception in try clause");
            }
            finally {
                throw new Exception("Exception in finally clause");
            }
        }
        catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }
}

出力結果

java.lang.Exception: Exception in finally clause

finally で後始末的な処理(たとえばDB接続のクローズ)をする場合、それらの処理のエラーは無視した方がよいことがある。このようなフローはテストもしづらいので、きちんと理解して適切にコーディングしたい。


上記の結果は、catch 句が存在した場合も同様。

class HelloWorld {
    public static void main(String[] args) {
        try {
            try {
                throw new Exception("Exception in try clause");
            }
            catch(Exception ex) {
                throw new Exception("Exception in catch clause");
            }
            finally {
                throw new Exception("Exception in finally clause");
            }
        }
        catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }
}

出力結果

java.lang.Exception: Exception in finally clause

Discussion