例外

Revised: Apr./27th/2004: Since: Jan./1st/2002

例外はオブジェクトとして扱われます。例外が発生すると、その種類に応じたクラス型のオブジェクトが生成されます。例外処理とは、このオブジェクトを捕まえて、処理することに他なりません。

全ての例外オブジェクトのクラス型は、Throwable クラスをスーパークラスに持ちます。その継承階層に従って、三つの種類に分類できます。

  1. Error...致命的なエラー。JVM かその外部で発生した例外であり、Java プログラムで処理することはできない。
  2. RuntimeException...正常な Java プログラムでは発生しない例外。例外処理は任意。
  3. Exception....正常な Java プログラムであっても、環境によっては発生する可能性がある。例外処理は必須。
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 などのほか、コアパッケージではさまざまな検査例外が使われています。



Copyright © 2001-2004 SUGAI, Manabu. All Rights Reserved.