独自の例外は、独自ゆえに、ランタイム系例外とすべきか非ランタイム系例外とすべきか悩ましいところです。
ランタイム系例外としたい場合には、RuntimeExceptionクラスまたはそのサブクラスを継承します。非ランタイム系例外としたい場合には、Exceptionクラスまたはそのサブクラス(ただし RuntimeException以下を除く)を継承します。
独自の例外 MyRuntimeExceptionを作成し、使用したプログラムを挙げます。この例外 MyRuntimeExceptionはランタイム系例外として宣言しています。
ソースコードは以下の通り。
O601/MyRuntimeException.java
/** * 独自の例外クラスです。 */ public class MyRuntimeException extends RuntimeException { /** * serialVersionUID。warning回避のため記述。 */ private static final long serialVersionUID = 1L; }
O601/O601.java
/** * 独自の例外を投げます。 */ public class O601 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { System.out.println("try catch構文有りの場合:"); try { O601.throwException(); System.out.println("ここには到達しない。"); } catch(MyRuntimeException e) { System.out.println("MyRuntimeExceptionを受け取りました。"); } System.out.println(); System.out.println("try catch構文無しの場合:"); O601.throwException(); } /** * 独自の例外を投げます。 */ private static void throwException() { System.out.println("独自の例外を投げます。"); throw new MyRuntimeException(); } }
実行結果は以下の通り。
try catch構文有りの場合: 独自の例外を投げます。 MyRuntimeExceptionを受け取りました。 try catch構文無しの場合: 独自の例外を投げます。 Exception in thread "main" MyRuntimeException at O601.throwException(O601.java:29) at O601.main(O601.java:21)
13行目では例外 MyRuntimeExceptionを捕捉しており、21行目ではこの例外を捕捉していないため強制終了になっていることが分かります。