try-catch句について以前書きましたが今回はtry-catch-finally句について書いていきます。
try-catchにfinallyが加わったことでどのような動きになるのか確認していきましょう。
try-catch-finally句とは
例外が発生しうる範囲をtryブロックで囲い、1つ以上の例外処理をcatchブロックに記述することができます。そして例外の有無に問わず処理の最後にはfinallyブロックが実行されます。
構文
try{
// 例外が発生しそうな処理
} catch(例外クラス型 変数){
// 例外時の処理
} finally{
必ず実行される処理
}
catch句は複数記述することができます。try-catch-finallyの書く順番は固定です。
try-catch-finally句 サンプルコード
サンプルコードを見ながらfinallyの動きを確認していきます。
try-catch-finally句の実行の順番 (例外が発生した場合)
public class Main {
public static void main(String[] args){
try{
System.out.println(“A”);
throw new Exception(); //強制的に例外発生
}catch(Exception e){
System.out.println(“B”);
}finally{
System.out.println(“C”);
}
}
}
実行結果
A
B
C
catch句の処理を実行したあとにfinally句の処理が実行されています。
try-catch-finally句の実行の順番 (例外が発生しない場合)
public class Main {
public static void main(String[] args){
try{
System.out.println(“A”);
}catch(Exception e){
System.out.println(“B”);
}finally{
System.out.println(“C”);
}
}
}
実行結果
A
C
try句の処理が終わった後にfinally句の処理が実行されています。
try-catch-finally句 return
public class Main {
public static void main(String[] args) {
System.out.println(sample());
}
public static String sample() {
int num[] = {};
try {
int i = num[0]; // 例外が発生
} catch (ArrayIndexOutOfBoundsException e) {
return “キャッチ”;
} finally {
return “ファイナル”;
}
}
}
実行結果
ファイナル
例外が発生するとcatch句へ移動します。catch句でreturnは実施されますが、一度保留になりfinallyでreturnが上書きされ最終的に「ファイナル」がreturnとして戻ります。
try-catch-finally句 変数
public class Main {
public static void main(String[] args) {
System.out.println(sample());
}
public static int sample() {
int array[] = {};
int num =0;
try {
int i = array[0];
} catch (ArrayIndexOutOfBoundsException e) {
return num += 10;
} finally {
num += 10;
}
return num;
}
}
実行結果
10
例外が発生するとcatch句へ移動しreturnが実施されます。catch句のreturnは保留になっておりfinally句でnumに10を足していますがreturnがないので戻り値は上書きされることはなく10のままです。
変数numには10が加算されているため、仮にcatchにreturnがなければcatchでnumに10を加算、finallyでnumに10を加算しており最後のreturnでは20が返却されます。
returnで返す値と変数では値が異なるので注意が必要です。
おわり
try-catchにfinallyがついただけでそんなに難しくないと思っていたのですが奥が深いですね。