Javaのお勉強その8
- 例外
配列の添え字が配列の範囲を超えるなどすると、例外が発生する。例外はその場所から「投げられる」という。
例外を捕捉するには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 // 例外が発生しても、プログラムは最後まで実行される。
- 例外の種類
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 件のコメント:
コメントを投稿