@634

例外時の処理

Advertisement

例外時の処理。tryとcatch

例外が発生した場合、try〜catchのメカニズムを使用して対応することができる。

例外発生の可能性がある処理を try ブロックの中に記述する。そして、例外発生時の処理を catch ブロックの中に記述する。

サンプル
public class Test{
    public static void main(String args[]){
        int[] array = new int[10];

        try{
            for(int i = 0; i <= 10; i++){
                array[i] = i;
            }
        }catch(Exception e){
            System.out.println("例外発生:" + e);
        }
    }
}
catch() の引数 e に例外の詳細が格納されている。
例外発生:java.lang.ArrayIndexOutOfBoundsException: 10

ArrayIndexOutOfBoundsException クラスの派生関係を調べてみると以下の通り。
java.lang.Object
  |
  +--java.lang.Throwable
        |
        +--java.lang.Exception
              |
              +--java.lang.RuntimeException
                    |
                    +--java.lang.IndexOutOfBoundsException
                          |
                          +--java.lang.ArrayIndexOutOfBoundsExceptionjava.sun.comより転載
catch(RuntimeException e)catch(ArrayIndexOutOfBoundsException e)でもキャッチできる。要するにポリモルフィズムを実現できる。
どの程度の範囲でキャッチしたいのかを考えて使う。通常は一番低いレベル(この場合、ArrayIndexOutOfBoundsException)でキャッチする。

応用

catch() ブロックは複数記述することができる。これにより、発生した例外による処理の分離をする事ができる。

public class Test{
    public static void main(String args[]){
        try{
            int[] array = new int[(int)(Math.random()*10 - 5)];
            array[10] = 1;
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("配列の要素外にアクセス。");
        }catch(NegativeArraySizeException e){
            System.out.println("配列を負の要素数にしようとした。");
        }
    }
}
プログラムの実行ごとにランダムで ArrayIndexOutOfBoundsException または NegativeArraySizeExceptionが発生するから、例外の種類によって処理を分けている。

※例外が発生した時点で catch ブロックに入るため、例外発生時には try ブロック内のその後の処理は実行されない。

finallyブロック

finallyブロックには、例外が発生した場合/しなかった場合、共に必ず行いたい処理を書く。
public class Test{
    public static void main(String args[]){
        try{
            //この時点で負の配列を作ろうとするかも
            int[] array = new int[(int)(Math.random() * 10 - 3)];

            //もしかしたらこれは要素外アクセスかも
            array[4] = 100;

            //ここまでくれば大丈夫。

        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("配列の要素外にアクセス。");
        }catch(NegativeArraySizeException e){
            System.out.println("配列を負の要素数にしようとした。");
        }finally{
            System.out.println("ここはfinallyブロック");
        }
    }
}
結果は3パターン。

結果1
配列の要素外にアクセス。
ここはfinallyブロック
結果2
配列を負の要素数にしようとした。
ここはfinallyブロック
結果3
ここはfinallyブロック

実行ごとに結果は違うけれど、例外が発生した時も、しなかった時も finally ブロックの処理は実行されている。

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール