Okapi Project

Exception (えくせぷしょん)

バージョン
2003 年 06 月 30 日 Ver.1.1
作成者
H.Izumi ( Xware )

目的

エラー処理を行いたい!

Exception ってなに?

ユーザがありえない値を入力したり、存在しないファイルからデータを読みこんだりしようとするとエラーが発生します。プログラマはエラーが生じた場合のことも考えて、プログラムを作成しなければなりません。もし、エラーのことを考えずにプログラムを作成した場合、エラーによってプログラムが異常終了してしまうこともあります。
Java では、様々なエラーを例外として扱います。例外は、 java.lang.Exception というクラスを親として、さなざまな例外クラスが定義されています。例外が発生する可能性がある場合は、必ずエラー処理を実装しなければなりません。

Exception の説明

配列要素の数をこえて代入する

例外にはいくつかの種類があります。
配列要素の数をこえて代入して、エラーが発生した例です。

public class ExceptionTest {
    public static void main(String[] args) {
        //5つの要素数を持つ配列を作成   
        int test[];
        test = new int[5];
        System.out.println("test[5]の配列を作成");
        //配列の10番目に、20を代入  
        test[10] = 20;
        System.out.println("無事終了");
    }
}

このプログラムは配列の要素数をこえて代入しようとするので、実行すると Exception が発生します。

test[5]の配列を作成
java.lang.ArrayIndexOutOfBoundsException: 10
    at ExceptionTest.(ExceptionTest.java:21)
    at ExceptionTest.main(ExceptionTest.java:12)
Exception in thread "main" 

実行結果をみてもわかる通り、メッセージが表示されて途中でプログラムが終了してしまいます。 これは、配列の要素数が、5つしかないのに対して、10番目の配列に代入しようとしたために、エラーがおきてしまいました。

Exception の使い方

例外を処理する

Java プログラムを作成する上で例外が発生する可能性がある場合、例外処理を行わなければなりません。例外が発生するコードに対して、例外処理を行わなければならないので、エラーに強いプログラムを書くことができます。
例外を処理するには、try、catch という基本的な例外処理の仕方があります。

try {
   例外の発生する可能性がある処理 ;
} catch (例外のクラス 変数名) {
   例外が起きた時に行う処理 ;
}
例外の発生する可能性がある処理
処理の中で例外の発生する可能性があるロジックを記述します。
例外のクラス
発生する可能性がある例外のクラスを記述します。
変数名
任意の名前で記述します。
例外が起きた時に行う処理
発生した例外と catch する例外が同じである場合、例外の処理を行います。

次のプログラムでは、try、catch ブロックを加えて、基本的な例外処理をしています。

public class ExceptionTest {
    public static void main(String[] args) {
        //例外の発生する部分を try を使って調べます
        try {
            int test[];
            test = new int[5];
            //配列の10番目に20を代入
            test[10] = 20;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("配列の要素数をこえています。");
            System.out.println(e + "クラスの例外が発生しました。");
        }
        System.out.println("終了しました。");
    }
}

実行結果は次のようになります。

配列の要素数をこえています。
java.lang.ArrayIndexOutOfBoundsException: 10クラスの例外が発生しました。
終了しました。
このプログラムのように try、catch を足すことで、
try ブロックの中で例外がおきると、処理を中断。
           ↓
発生した例外が catch ブロックの( )内の例外と一致していた場合、catch ブロック内の処理を行う。
           ↓
catch ブロックが終了したら try、catch ブロックのあとから処理を行う。
以上のように、例外処理を行うと、プログラムが途中で異常終了することは無くなります。

ポイント

ヒント

例外の発生の有無にかかわらないで必ず処理をしたい!

finally ブロックを使うと例外有無にかかわらずに、そのメソッド内で最後に必ず処理が行われます。

try{
・・・・・
}
catch (例外のクラス 変数名) {
・・・・・
}
finally{
必ず最後に処理を行う ;
}

このように記述することで、 finally ブロック処理を最後に行うことが出来ます。

もっと自由に例外を処理したい!

今までの例は、例外を受けとって処理することを記述してきましたが、これとは逆に例外をおこすコードというものを作成することが出来ます。これは、自分の設計したクラスの中に、例外を送出することの出来る機能を持たせるということです。
例外を送出させるクラスを設計しておくことで、いろいろな例外をおこす準備が出来ます。自分で例外クラスを作成するには、
Exception クラスのサブクラスを拡張して例外クラスを宣言する。
ということが必要です。

例外を送出したい!

次の例は Exception クラスから、TestException クラスという独自の例外クラスを拡張するパターンです。

class TestException extends Exception
{
}

例外クラスを作成したら、例外を送出することが出来ます。例外を送出するには、throws を記述する必要があります。

例外を送出する可能性があるメソッドを定義しています。

public void setTest (int test) throws TestException {
    //testの値が0未満のときに例外を送出します。
    if (test < 0) {
        TestException e = new TestException() ;
        throw e ;
    }
}
そして、実際に例外を送出させプログラムの例です。
public class ExceptionTest {

    public static void main(String[] args) {
        ExceptionThrowsTest ett = new ExceptionThrowsTest();
        int test = -10;
        try {
            ett.setTest(test);
        } catch (TestException e) {
            System.out.println(e + "が送出されました。");
        }
    }
}

実行結果です。

TestExceptionが送出されました。

関連


Copyright © 2003 - 2006 Okapi Project All Rights Reserved.