今回は、Javaの例外処理についてです。先日、Javaのソースコードを仕事で眺めていたところタイトル通り例外をキャッチするcatch句の中でthrowしている実装がありました。これ自体は確かによくあることなのかなと思ったのですが、この場合にfinally句の中身は実行されるの?されないの?と感覚的に分からなかったので、実際に簡単なコードで検証していきたいと思います。また、合わせて気になる点についても検証していくのでよろしれければ見ていってください。
catch句においてreturnされる際の挙動を検証するコード
検証するときに使用するコードは、以下の通りです。
結果が分かりやすいようにたくさん、Systen.out.printlnで標準出力にコメントを出力しています。
package studyJava; public class ExceptionTest { public static void main(String[] args) { try { System.out.println("exceptionTest()を呼び出します"); exceptionTest(); System.out.println("exceptionTest()の呼び出し完了しました。"); } catch (Exception e) { System.out.println("main()のException句に入りました。"); } } private static boolean exceptionTest() throws Exception { System.out.println("exceptionTest()に入りました。"); try { System.out.println("Exceptionを投げる前"); throw new Exception("最初のException"); } catch (Exception e) { System.out.println("exceptionTest()のcatch句に入りました。"); return false; } finally { System.out.println("exceptionTest()のfinally句に入りました。"); } } }
catch句においてreturnされる際の挙動を検証した結果
それでは結果を確認しましょう。catch句でreturnした場合でもfinally句の配下のコードは実行されるようです。
exceptionTest()を呼び出します exceptionTest()に入りました。 Exceptionを投げる前 exceptionTest()のcatch句に入りました。 exceptionTest()のfinally句に入りました。 exceptionTest()の呼び出し完了しました。
catch句においてthrowされる際の挙動を検証するコード
今度はcatch句の中でthrowされる場合を確認していきましょう。使用するコードは前回とほぼ同じです。
先ほどreturnしていた分をthrowに変更しているだけです。
package studyJava; public class ExceptionTest2 { public static void main(String[] args) { try { System.out.println("exceptionTest()を呼び出します"); exceptionTest(); System.out.println("exceptionTest()の呼び出し完了しました。"); } catch (Exception e) { System.out.println("main()のException句に入りました。"); } } private static void exceptionTest() throws Exception { System.out.println("exceptionTest()に入りました。"); try { System.out.println("Exceptionを投げる前"); throw new Exception("最初のException"); } catch (Exception e) { System.out.println("exceptionTest()のcatch句に入りました。"); throw new Exception("2回目のException"); } finally { System.out.println("exceptionTest()のfinally句に入りました。"); } } }
catch句においてthrowされる際の挙動を検証した結果
それでは今回も同じように結果を確認しましょう。catch句でthrowした場合でも、finally句の配下のコードが実行されるようです。
exceptionTest()を呼び出します exceptionTest()に入りました。 Exceptionを投げる前 exceptionTest()のcatch句に入りました。 exceptionTest()のfinally句に入りました。 main()のException句に入りました。
おわりに
いかがでしたでしょうか?みなさまの想像通りの挙動でしたでしょうか?意外とここらへんの細かい挙動を理解していないと、誤った例外処理をしてしまうかもしれませんので注意したいところですね。ちなみに、finally句でreturnすることはご法度のようです。なぜなら、発生した例外処理を握りつぶす結果になりかねないからです。本日も最後までお読みいただきありがとうございました。では今回はこのへんで。