RuntimeExceptionとは?初心者のJavaの勉強

例外処理(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

Java

Posted by Nakamoto