ユーザがありえない値を入力したり、存在しないファイルからデータを読みこんだりしようとするとエラーが発生します。プログラマはエラーが生じた場合のことも考えて、プログラムを作成しなければなりません。もし、エラーのことを考えずにプログラムを作成した場合、エラーによってプログラムが異常終了してしまうこともあります。
Java では、様々なエラーを例外として扱います。例外は、 java.lang.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番目の配列に代入しようとしたために、エラーがおきてしまいました。
Java プログラムを作成する上で例外が発生する可能性がある場合、例外処理を行わなければなりません。例外が発生するコードに対して、例外処理を行わなければならないので、エラーに強いプログラムを書くことができます。
例外を処理するには、try、catch という基本的な例外処理の仕方があります。
try { 例外の発生する可能性がある処理 ; } 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 を足すことで、
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が送出されました。