エラーと検査例外と非検査例外の違い
種類 | 意味 |
---|---|
エラー error |
プログラムからは対処のしようがない事態を指す。 (実行マシンのメモリが不足していたり、ディスクの読み込み書き込み権限が無かったり…) エラーは例外処理をすることを求められていないだけであって、catchして処理することが可能。 |
検査例外 Exception |
例外処理を記述したかどうかをコンパイラが検査する例外を指す。 |
非検査例外 RuntimeException 及びそのサブクラス |
例外処理を記述したかどうかをコンパイラが検査しない例外を指す。 |
Exceptionクラスのサブクラスは、RuntimeExceptionとそのサブクラスを除いてすべて検査例外である。
そのため、Exceptionクラスを継承している例外クラスは、
try-catchしているかthrows句で宣言しているかのどちらかを強制される。
一方、ExceptionクラスのサブクラスであってもRuntimeExceptionとそのサブクラスは
非検査例外として扱われる。そのため、try-catchしているかthrows句で宣言しているかを強制されない。
(宣言してもしてなくても可)
Exceptionの種類とその意味
種類 | 意味 |
---|---|
ArrayIndexOutOfBoundsException | 配列の要素外にアクセスしたときに発生する表す例外クラス。 |
IndexOutOfBoundsException | 存在しない要素を取り出そうとしてたときに発生する例外クラス。 |
StringIndexOfBoundsException | 文字列の範囲外アクセスを表す例外クラス。 |
ClassCastException | 継承関係や実現関係に無いクラスにキャストしようとしたとき発生する例外クラス。 |
IllegalArgumentException | 利用される側のオブジェクトが不正な引数を渡されたことを、利用する側のオブジェクトに通知するための例外。 |
IllegalStateException | 利用される側のオブジェクトが、まだ利用するための準備が終わっていないなどの理由でスローする例外。 |
NumberFormatException | 数値に変換しようとして失敗したときにスローされる例外。 |
ExceptionInInitializerError | staticイニシャライザを処理している間にトラブルが発生したときに強制終了させるためのエラー。 |
StackOverflowError | 再帰処理をしているとスタック領域が足りなくなってくる。JVMが足りないことを検知したときに発生するエラー。 |
NoClassDefFoundError | JVMが実行対象のクラスファイルを発見できなかったときにスローする例外。 |
OutOfMemoryError | ヒープ領域が足りなくなったときにスローする例外。 |
VirtualMachineError | 「OutOfMemoryError」や「StackOverflowError」の親クラス。 JVMが壊れているか、または動作を継続するのに必要なリソースが足りなくなったときにスローする例外。 |
InternalError | 「VirtualMachineError」のサブクラス。 JVM内で何らかの内部エラーが発生したことを指す。 |
ArrayIndexOutOfBoundsExceptionの発生方法と回避方法
実行したとき、下記のコードのようにListの範囲外(存在しないINDEX)にアクセスすると発生するError。
回避するには、list.get(n)のnを存在するINDEX値に修正すること。
Java
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
System.out.println(list.get(1));
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
IndexOutOfBoundsExceptionの発生方法と回避方法
実行したとき、下記のコードのように配列の範囲外(存在しないINDEX)にアクセスすると発生するError。
回避するには、num[n]のnを存在するINDEX値に修正すること。
Java
int[] num = new int[] {10,20,30};
System.out.println(num[3]);
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
StringIndexOfBoundsExceptionを発生させてみる
実行したとき、下記のコードのように文字列の範囲外(存在しないINDEX)にアクセスすると発生するError。
Java
String str = "abc";
str.substring(2,4);
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
ClassCastExceptionを発生させてみる
実行したとき、下記のコードのように型変換に失敗した場合発生するError。
Java
ArrayList list = new ArrayList();
list.add(123);
String str = (String)list.get(0);
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
意図的にExceptionを発生させるには
これらのExceptionを手っ取り早くテストするには以下の手法が便利。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!