Java -例外とは-
Javaでは、プログラムの実行時になんらかの問題やエラーが発生すると、それに対応するための クラスが自動的にインスタンス(オブジェクト)を生成します。
これを例外、または例外オブジェクトといいます。
例外クラス
例外クラスは、すべてjava.langパッケージ内のThrowableクラスを継承しています。
Throwableクラスを継承したクラスのオブジェクトは、ある処理で例外が発生した時に
自動的に生成されます。
例外オブジェクトをが自動的に生成されることを「スローする」「投げる」などと言います。
プログラムは、投げられた例外オブジェクトをキャッチして例外の内容を確認し、例外オブジェクトを無効化することで処理を続行することができるようになります。
キャッチしないとプログラムの実行はそこで中断してしまいます。
例外のクラスは、さらにErrorクラスを継承するクラスと、Exceptionクラスを継承クラスに大別することができます。
Errorクラスを継承するクラスは、プログラムの実行に致命的な障害が発生した場合に生成される例外で、JVM(Java仮想マシン)で検出されるエラーです。
例えば、メモリ不足やスタックオーバーフローの場合などにこのエラーになります。
Exceptionクラスのサブクラスは、主にプログラム時のバグによって発生する例外です。
例えば、ArrayIndexOutBoundsExceptionは配列のインデックス番号が範囲外である場合に発生する例外です。
Exceptionクラスのサブクラスで、RuntimeExceptionクラスやそのサブクラスを除くものは、プログラミングによって回避できないエラー発生が生じた場合に発生します。
例えば、実行時にファイルが存在しない場合や、ネットワーク上でデータが送信できない場合などです。
Throwableクラスは、すべての例外クラスのスーパークラスです。
チェック例外と非チェック例外
チェック例外は、ソースファイルをjavacコマンドによってコンパイルする際、例外処理がなされているかどうか必ずチェックされる例外です。
例外処理がなされていない場合は、コンパイルエラーとなります。
非チェック例外は、コンパイル時にはそのようなチェックはされません。
Errorクラスとそのサブクラス(非チェック例外)
このクラスは、システム関係の回復不可能なエラーが生じた場合に発生する(生成される)クラスです。
クラス名 | 例外発生の原因 |
---|---|
ExceptionInInitializerError | static初期化子で想定外のエラー |
NoClassDefFoundError | JVMがロードしようとすクラスのクラス定義が見つからない |
OutOfMemoryError | メモリ不足 |
StackOverfolwError | スタック領域の不足 |
これらのエラーは、通常Javaのプログラムでは回復することができません。そのため 非チェック例外となっていて、コンパイル時にはこれらの例外に対する例外処理が記述されているかどうかはチェックされません。
RuntimeExceptionクラスとそのサブクラス(非チェック例外)
RuntimeExceptionクラスとそのサブクラスは、主にプログラムにバグが存在している 場合に発生する例外です。
Errorクラスとそのサブクラス場合と同様、非チェック例外なので、例外処理を記述しなくても コンパイルエラーにはなりません。
クラス名 | 例外発生の原因 |
---|---|
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パッケージに属するため、クラス名だけの記述で用いることができます。