ホーム > Java > 第6章-1 例外とは

Java -例外とは-

Javaでは、プログラムの実行時になんらかの問題やエラーが発生すると、それに対応するための クラスが自動的にインスタンス(オブジェクト)を生成します。
これを例外、または例外オブジェクトといいます。

例外クラス

例外クラスは、すべてjava.langパッケージ内のThrowableクラスを継承しています。
Throwableクラスを継承したクラスのオブジェクトは、ある処理で例外が発生した時に 自動的に生成されます。

例外オブジェクトをが自動的に生成されることを「スローする」「投げる」などと言います。
プログラムは、投げられた例外オブジェクトをキャッチして例外の内容を確認し、例外オブジェクト を無効化することで処理を続行することができるようになります。
キャッチしないとプログラムの実行はそこで中断してしまいます。

例外

例外のクラスは、さらにErrorクラスを継承するクラスと、Exceptionクラスを継承クラスに 大別することができます。

Errorクラスを継承するクラスは、プログラムの実行に致命的な障害が発生した場合に生成される例外で、 JVM(Java仮想マシン)で検出されるエラーです。
例えば、メモリ不足やスタックオーバーフローの場合などにこのエラーになります。

Exceptionクラスのサブクラスは、主にプログラム時のバグによって発生する例外です。
例えば、ArrayIndexOutBoundsExceptionは配列のインデックス番号が範囲外である場合に発生する例外です。

Exceptionクラスのサブクラスで、RuntimeExceptionクラスやそのサブクラスを除くものは、プログラミングによって 回避できないエラー発生が生じた場合に発生します。
例えば、実行時にファイルが存在しない場合や、ネットワーク上でデータが送信できない場合などです。

Throwableクラスは、すべての例外クラスのスーパークラスです。

チェック例外と非チェック例外

チェック例外は、ソースファイルをjavacコマンドによってコンパイルする際、例外処理が なされているかどうか必ずチェックされる例外です。
例外処理がなされていない場合は、コンパイルエラーとなります。

非チェック例外は、コンパイル時にはそのようなチェックはされません。


Errorクラスとそのサブクラス(非チェック例外)

このクラスは、システム関係の回復不可能なエラーが生じた場合に発生する(生成される)クラスです。

Errorクラスの主なサブクラス

クラス名 例外発生の原因
ExceptionInInitializerError static初期化子で想定外のエラー
NoClassDefFoundError JVMがロードしようとすクラスのクラス定義が見つからない
OutOfMemoryError メモリ不足
StackOverfolwError スタック領域の不足

これらのエラーは、通常Javaのプログラムでは回復することができません。そのため 非チェック例外となっていて、コンパイル時にはこれらの例外に 対する例外処理が記述されているかどうかはチェックされません。


RuntimeExceptionクラスとそのサブクラス(非チェック例外)

RuntimeExceptionクラスとそのサブクラスは、主にプログラムにバグが存在している 場合に発生する例外です。
Errorクラスとそのサブクラス場合と同様、非チェック例外なので、例外処理を記述しなくても コンパイルエラーにはなりません。

RuntimeExceptionクラスの主なサブクラス

クラス名 例外発生の原因
ArrayIndexOutOfBoundsException 配列要素の範囲外指定
ArithmeticException 整数を0で除算
ClassCastException 不適切なクラスのキャスト
IllegalArgumentException 引数の設定が不正
IllegalStateException 不正または不適切な状態でのメソッドの呼び出し
NullPointerException null値の変数の使用
NumberFormatException 文字列を数値に変換する際、変換不能な文字列を指定

Exceptionクラスとそのサブクラスで、RuntimeExceptionクラスとそのサブクラス以外のもの (チェック例外)

コンパイル時に例外処理がなされているかどうかをチェックする例外クラスです。
例外が記述されていない場合は、コンパイルエラーとなります。

主なチェック例外

クラス名 例外発生の原因
java.lang.ClassNotFoundException クラス、インタフェースが見つからない
java.lang.InterruptedException スレッド内で割り込みが発生した
java.io.FileNotFoundExcption ファイルが見つからない
java.io.IOException 入出力例外

チェック例外のクラスのうち、ClassNotFoundExceptionやInterruptedExceptoinなどは、 java.langパッケージに属するため、クラス名だけの記述で用いることができます。