Categories: Java

【Java入門】エラーと検査例外と非検査例外

エラーと検査例外と非検査例外の違い

種類 意味
エラー
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がオススメ!同僚に差をつけよう!

shiakisudev