try

Revised: Feb./15th/2003: Since: Jan./27th/2002

例外処理の基本は、JVM によって生成された例外オブジェクトをキャッチして、処理することです。try ブロック内部の処理で JVM が生成した例外オブジェクトは、catch ブロックでキャッチして、後処理のロジックを組み込むことができます。

try catch ブロック

try {
	例外が発生しそうな処理
} catch (例外1クラス 変数) {
	例外処理1
} catch (例外2クラス 変数) {
	例外処理2
} finally {
	共通処理
}

考え方としては、 try ブロック内で発生した例外が自動的に throw されて、これを catch して、適当に処理します。tryは「試す」、throwは「投げる」、catchは「捕まえる」ですね。try ブロック内で例外が発生しそうなコードを試してみて、実際に例外が発生すると例外オブジェクトが投げられ、それを適当なcatchブロックが捕まえて処理するのです。

次の項で具体的なサンプルを挙げて説明します。ここでは制御の流れの一般論を押さえてください。

0.例外が発生しなかった場合
try ブロック内部が実行されたあとは、共通処理が実行されます。
1.例外1が発生した場合
try ブロック内部で例外が発生した後は、対応する例外処理1が実行され、最後に共通処理が実行されます。
2.例外2が発生した場合
try ブロック内部で例外が発生した後は、対応する例外処理2が実行され、最後に共通処理が実行されます。
3.例外1、例外2以外の例外が発生した場合
try ブロック内部で例外が発生した後は、共通処理が実行されます。

以上のケースのいずれの場合でも、続いて後続の処理が実行されます。例外が発生した try ブロック内には制御は戻りません。

例外オブジェクトの粒度

Java における例外は、オブジェクトとして発生します。任意の粒度の例外がオブジェクトとしてコア・パッケージに定義されています。処理可能な例外で、最も粒度の大きいものは、全ての処理可能な例外オブジェクトがスーパークラスに持つ Exception オブジェクトです。以下、Exception クラスのサブクラスとして、個別的な例外に応じて例外クラスが定義されています。

例えば、配列に対して、不正なインデックスを要求すると、ArrayIndexOutOfBoudsException クラス型のオブジェクトが発生します。

ArrayIndexOutOfBoudsException
java.lang.Object
  |
  +--java.lang.Throwable
        |
        +--java.lang.Exception
              |
              +--java.lang.RuntimeException
                    |
                    +--java.lang.IndexOutOfBoundsException
                          |
                          +--java.lang.ArrayIndexOutOfBoundsException

文字列を数値に変換する際に、数値にできない文字列が与えられると、 NumberFormatException クラス型オブジェクトが生成されます。

java.lang.Object
  |
  +--java.lang.Throwable
        |
        +--java.lang.Exception
              |
              +--java.lang.RuntimeException
                    |
                    +--java.lang.IllegalArgumentException
                          |
                          +--java.lang.NumberFormatException

try catch ブロックでは、catch ブロックの記述された順番で例外オブジェクトがキャッチされます。従って、粒度の小さいものから順番に catch ブロックを記述するべきです。例えば、最初に最も粒度の大きい Exception オブジェクトをキャッチすると、残りの catch ブロックには絶対に制御が回りません。全ての例外オブジェクトは Exception クラス型に代入可能なために、最初に記述した Exception クラス型 catch ブロックでつかまってしまうためです。

悪い例

try {
	// 処理
} catch (Exception e) {
	// 処理
	// 全ての例外がここでつかまる
} catch (java.lang.NumberFormatException e) {
	// 処理
} finally {
	// 処理
}

全ての例外が、最初の catch でキャッチされるので、二番目の NumberFormatException のキャッチには絶対に制御が移らない。

良い例

try {
	// 処理
} catch (java.lang.NumberFormatException e) {
	// 処理
} catch (Exception e) {
	// 処理
	// 全ての例外がここでつかまる
} finally {
	// 処理
}

NumberFormatException は最初の catch にキャッチされる。それ以外の全ての例外は二番目の catch で捕まえられる。



Copyright © 2001, 2003 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu