例外とは、エラーのような状態である。例えば、ゼロで除算を行う場合、配列の範囲を超えてアクセスした場合などである。このような場合、プログラムを止めないで、特別の処理をすると都合がよい場合がある。
今回はその例外を扱う。
ゼロによる除算を例とする。ゼロで割ることはできないないので、エラー状態になることが予想される(ArithmeticException: / by zeroの例外)。
図Proo8_1_srcはその例外が起こるプログラムである。実行すると、11,12行で示されるようなメッセージが出てプログラムは止まる。このままでも、ゼロによる割り算であるから、やむを得ないと分かり、そのようなことのないように対処できる。例えば、bをゼロとしないなど。
しかし、JAVAには例外に対して特別に対処する方法がある。図Proo8_2_srcはtry-catch-finallyという方法で対処している。
この方法は例外が起こりそうな部分をtryブロックで囲み、例外が起きたときシステムから送られくる例外オブジェクトを受け取る例外参照変数(ae)を用意しておき、その後の処理をcatchブロックに書いておく。そのようにすれば、どのような例外が起こったのかが分かり、更に例外が発生した直後にプログラムを止めてしまわないで、必要な処理ができる。finallyブロックはなくてもよい。書いておくと例外が起きても、起きなくてもそのブロックは処理される。try-catch-finally構造は以下のように書く。
try{
例外が起きる可能性がある部分
}
catch(例外参照変数の型 例外参照変数){
例外が起きたときの処理
}
finally{
例外の有無にかかわらず実行される処理
}
以下にソースを二つ示す。
/* 例外処理 */ class Proo8_1 { public static void main(String[] args){ int a=5,b=0,c=100; System.out.println("a="+a+" b="+b+" c="+c); c=a/b; } } /* a=5 b=0 c=100 Exception in thread "main" java.lang.ArithmeticException: / by zero at Proo8_1.main(Proo8_1.java:6) */ /* 例外処理 */ class Proo8_2 { public static void main(String[] args){ int a=5,b=0,c=100; try{ System.out.println("a="+a+" b="+b+" c="+c); c=a/b; } catch(ArithmeticException ae){ System.out.println(ae+"の例外が発生しました"); System.out.println("a="+a+" b="+b+" c="+c); } finally{ System.out.println("例外のあるないに関わらずfinallyは処理される"); } } } /* a=5 b=0 c=100 java.lang.ArithmeticException: / by zeroの例外が発生しました a=5 b=0 c=100 */