2011年8月16日火曜日

Javaの私的まとめ8

Javaのお勉強その8

  1. 例外

    配列の添え字が配列の範囲を超えるなどすると、例外が発生する。例外はその場所から「投げられる」という。

    例外を捕捉するにはtry~catch節を用いる。例外が発生する箇所でtry{ }、例外を受け取る場所でcatch(指定した例外){ }と書く。finallyを付けると、例外の発生の有無に関わらず実行される。例えばファイルを閉じるなどの作業をここで行われることがある。

    class exceptionTest{
        static int method(){
    	int[] array = new int[3];
    	try{
    	    array[10] = 5;
    	}catch(ArrayIndexOutOfBoundsException e){
    	    System.out.println(e);
    	    return -1;
    	}finally{
    	    System.out.println("Called finally");
    	}
    	return 0;
        }
        public static void main(String[] args){
    	int x = method();
    	System.out.println(x);
        }
    }
    結果は次のようになる。
    java exceptionTest
    java.lang.ArrayIndexOutOfBoundsException: 10
    Called finally
    -1 // 例外が発生しても、プログラムは最後まで実行される。
    
  2. 例外の種類

    Throwableはスローされるクラスを表す。ThrowableのサブクラスであるErrorは回復不可能なエラーでありキャッチすべきでない状態にある。一方、Throwableのもう一つのサブクラスであるExceptionはさらにRuntimeExceptionと検査例外のサブクラスに分かれる。RuntimeExceptionはコンパイル時にチェックされない。その他の例外はコンパイル時にチェックされる。

    Errorとそのサブクラスもコンパイル時にチェックされない。

    検査例外が発生する場合は、以下のどちらかの方法で処理しなければならない。

    // 1つめの処理方法
    int test(){
     try{
      // 処理1
     }catch(例外){
      // 処理2
     }
    }
    // 2つめの処理方法
    int test() throws 例外{
     // 処理1
    }
    
    2つめの処理方法の場合は、メソッドを呼ぶときに再び、上のどちらかの処理を噛ませる必要がある。

    複数の例外がある場合はtry~catch~catch~finallyのように書く。

    複数の例外が投げられうる候補にある場合、次のように書くことができる。

    int test() throws 例外1, 例外2{
     // 処理
    }

    例外はJVMとプログラムが投げるものの2種類に分けられる。

    オーバーライドされたメソッドのスローする検査例外は、もとのメソッドのスローする例外かそのサブクラスでなければならない。

    RuntimeExceptionとそのサブクラスは検査例外なので自由にスローできる(スーパークラスで何をスローしようともサブクラスでは何をスローしても良い)。また、オーバーライドされたメソッドで例外をスローしなくて良い。

    インタフェースのメソッドもオーバーライドと同様のルールが適用される。

    Exceptionを派生(extends)させることで、独自の例外を定義できる。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計