例外処理(try-catch)について調べていたら、RuntimeExceptionを理解するのに時間がかかったのでまとめます。
RuntimeExceptionとは
RuntimeExceptionは実行時の例外を拾うことができます。
例外の種類について
例外と言えばArrayIndexOutOfBoundsExceptionなら配列のインデックス以外を呼び出しているから発生している、NullPointerExceptionならNullが受け渡されてしまい処理が止まっているなど理由が明解でした。RuntimeExceptionは「実行時の例外」と不明確で釈然としないと思うのではないでしょうか。
以下の図でThrowableの継承関係をみてみましょう。
何かしら発生する問題の種類としてエラー(Error)と例外(Exception)があります。さらに例外には検査例外と非検査例外(例外処理を記述したかコンパイラが検査しない)に分けることができます。そしてRuntimeExceptionは非検査例外となります。
RuntimeExceptionはExceptionを親に持っています。Exception(例外)の一つです。
例外・エラーのクラスの階層を知るとRuntimeExceptionが「実行時の例外」とひとまとまりになっていることもわかるかと思います。
検査例外と非検査例外の違いについては以下でも書いていますので、合わせて読んでいただければと思います。
RuntimeExceptionでtry-catch
ArrayIndexOutOfBoundsExceptionなどRuntimeExceptionの子要素はRuntimeExceptionでキャッチすることができます。(もっと言えばさらに親クラスであるException、Throwableでもcatchできます)
サンプルコード RuntimeExceptionでcatch
RuntimeExceptionでNullPointerExceptionをキャッチします。
String str = null;
try{
int i = str.length();
System.out.println(i);
}catch(RuntimeException e){
System.out.println(“NullPointerExceptionをキャッチ”);
}
結果
NullPointerExceptionをキャッチ
RuntimeExceptionの子クラスで発生した例外全てをキャッチすることができます。
どんな例外が発生するかわからない時にひとまずRuntimeExceptionでキャッチしておき処理はそのまま続行するなどということができます。
サンプルコード RuntimeExceptionのエラーの種類を知る
せっかくならキャッチしたエラーの種類も知りたいなと思うこともあると思います。
String str = null;
try{
int i = str.length();
System.out.println(i);
}catch(RuntimeException e){
System.out.println(e.getClass().getName());
}
結果
java.lang.NullPointerException
実行時に例外がスローされるのではなくコンソール上に例外の種類が表示されます。
便利です。
おわり
例外、エラーには種類があったんですね。エラー・例外は必ず対応しなければいけないと思っていましたが対応しなくて良いものもあったんですね。
errorは致命的で発生したら諦めモード、catchして対応しなければいけないものは対応しようという程度なんですね。
余談ですがエラー・例外の一覧がみたいなと思い見つけたサイト。
https://programming.guide/java/list-of-java-exceptions.html
参考
How to know which exception is thrown