Revised: Apr./27th/2004: Since: Jan./1st/2002
例外はオブジェクトとして扱われます。例外が発生すると、その種類に応じたクラス型のオブジェクトが生成されます。例外処理とは、このオブジェクトを捕まえて、処理することに他なりません。
全ての例外オブジェクトのクラス型は、Throwable
クラスをスーパークラスに持ちます。その継承階層に従って、三つの種類に分類できます。
java.lang.Object | +--java.lang.Throwable | +--java.lang.Error <- 例外処理不可能。 | +--java.lang.Exception <- 例外処理可能。必須。 | +--java.lang.RuntimeException <- 例外処理可能。任意。
Error
java.lang.Object | +--java.lang.Throwable | +--java.lang.Error
このクラスをスーパークラスとして派生する系列の例外は、致命的なエラーです。アプリケーション側で処理できない JavaVM で検出されるようなエラーです。具体的には、メモリ不足、AWTエラー、スレッド・エラーなどに対応するクラスが派生しています。
Java プログラムで例外処理しようにも、プログラムの実行の継続ができないので、例外処理は不可能です。
RuntimeException
java.lang.Object | +--java.lang.Throwable | +--java.lang.Exception | +--java.lang.RuntimeException
Exception
クラスから派生しています。今までに学習した範囲では、実際に遭遇する例外の殆どがこのクラスから派生しています。具体的には、配列要素数、文字列の数値への変換、ゼロ除算などに対応する例外クラスのスーパークラスです。
このクラスの系列に入る例外は、正常なプログラムでは発生しないはずのものであり、例外処理のロジックを組み込むことは必須ではありません。
RuntimeException
を継承した、例外処理が必須でない例外を、非検査例外(unchecked exceptions classes)と呼びます。
ゼロ除算などで発生する算術例外 ArithmeticException
、不正な引数、または不適切な引数をメソッドに渡したことを示すためにスローする IllegalArgumentException
、null が代入された参照を使おうとすると発生する NullPointerException
、不正なインデックスを使って配列がアクセスされたことを示す ArrayIndexOutOfBoundsException
などが代表的です。
Exception
java.lang.Object | +--java.lang.Throwable | +--java.lang.Exception
RuntimeException
クラス以外の Exception
クラスから派生する例外は、ロジックで回避することが難しいものです。具体的には、入出力異常、ファイルが見つからない、クラス/メソッドが見つからないなどに対応する例外のスーパークラスです。
このクラスの系列に含まれる例外が発生しそうな処理については、 try{}catch(){}
ブロックを用いた例外処理が必須です。これがない場合は、コンパイルエラーになります。
このケースの例外処理の代表が、 java.io
パッケージに含まれるクラスのメソッドで見られます。
RuntimeException
以外の Exception
を継承した、例外処理が必須である例外を、検査例外(checked exceptions classes)と呼びます。
クラスを文字列で参照して呼び出そうとする場合に、対応するクラスが存在しない場合を懸念する ClassNotFoundException
、JVM 外部への入出力時にデバイス/ファイルが利用可能でない場合を懸念する各種の例外のスーパークラスである IOException
、データベースに対する SQL エラーやコネクション失敗を懸念する IOException
、スレッドの割り込みを懸念する InterruptedException
などのほか、コアパッケージではさまざまな検査例外が使われています。