try-catch-finally文を利用した例外処理について
Javaでは実行に発生したエラーを例外と呼びます。
例外が発生した場合、Java上で例外に対する処理を記述していない場合、プログラムはそこで強制終了します。
下記のコードは意図的に例外を発生させ、実行結果を確認しています。
public class Main {
public static void main(String[] args) {
int[] test = {1,2,3};
for(int i = 0; i <= 3; i++){
System.out.println(test[i] + "回目のループ")
}
System.out.println("ループ終了");
}
}
実行結果
1回目のループ
2回目のループ
3回目のループ
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at test.Test.main(Main.java:5)
例外(ArrayIndexOutOfBoundsException)発生時にプログラムが強制終了し、"ループ終了"が表示されていない事が分かります。
例外処理
次は例外に対する処理を記述し、例外が発生してもプログラムが強制終了しないようにしてみます。
例外に対する処理文は次のような構文になります。
try{
例外が発生する可能性がある処理
}catch(例外のデータ型 変数名){
指定された例外が発生した場合に実行する処理
}finally{
例外の有無に関わらず実行する処理
}
この構文を利用して最初のコードを書き直してみます。
public class Main {
public static void main(String[] args) {
try {
int[] test = {1,2,3};
for(int i = 0; i <= 3; i++){
System.out.println(test[i] + "回目のループ");
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("例外発生");
} finally {
System.out.println("ループ終了");
}
System.out.println("try-catch-finally外の処理");
}
}
実行結果
1回目のループ
2回目のループ
3回目のループ
例外発生
ループ終了
try-catch-finally外の処理
例外発生後にfinallyブロックに記述された処理が実行され、try-catch-finally文外の処理も実行されている事が分かります。
メソッド内での例外処理
この記述方法ではtry文の中で発生した例外しか検知できず、try文で呼び出したメソッド内で発生した例外を検知する事ができません。
try文で呼び出したメソッド内で発生した例外を検知させる場合はメソッドの定義時にthrows文を設定する必要があります。
先ほどのコードのfor文
をメソッド化してthrows文を利用した例外処理を行ってみます。
public class Main {
public static void main(String[] args) {
try {
int[] test = {1,2,3};
method(test);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("例外発生");
} finally {
System.out.println("ループ終了");
}
System.out.println("try-catch-finally外の処理");
}
static void method(int[] test) throws ArrayIndexOutOfBoundsException {
for(int i = 0; i <= 3; i++){
System.out.println(test[i] + "回目のループ");
}
}
}
実行結果
1回目のループ
2回目のループ
3回目のループ
例外発生
ループ終了
try-catch-finally外の処理
メソッド内で起こった例外がtry内で検知されている事が分かります。
まとめ
- JAVAの実行時に発生したエラーを例外と呼び、例外に対する処理を行わないとプログラムがそこで強制終了してしまう。
- try-catch-finally文で例外処理を行う事ができる。
- メソッドにThrows文を追加することで、メソッドを呼び出した部分で例外を検知できる。