try-catch-finally句内のreturnについて

More than 1 year has passed since last update.

try-catch-finally句の中で、returnをする場合、

finally句を設定するとreturnする前にかならずfinally句の中が実行される。


source-catch

public class Try {

public static void main(String[] args) {
String i=TryCatch();
System.out.println(i);
}

public static String TryCatch(){
System.out.println("スタート!");
String str = null;//nullにする
try{
str.toString(); //NullPointerException
System.out.println("ほげほげ");
return "Try句からのリターンです。";
}catch(Exception e){
System.out.println("ふがふが");
return "Catch句からのリターンです。";
}finally{
System.out.println("finally句が実行されました。");
}
}
}


実行結果

スタート!

ふがふが
finally句が実行されました。
Catch句からのリターンです。

Catch句の中を実行された後はfinally句も実行されることは知っていたが、

returnを書いても実行されたり、try句の中のreturnにまでカバーしてくれるとは思わなかった


source-try

public class Try {

public static void main(String[] args) {
String i=TryCatch();
System.out.println(i);
}

public static String TryCatch(){
System.out.println("スタート!");
String str = "適当な文字列";//ここを変える
try{
str.toString(); //例外発生しない
System.out.println("ほげほげ");
return "Try句からのリターンです。";
}catch(Exception e){
System.out.println("ふがふが");
return "Catch句からのリターンです。";
}finally{
System.out.println("finally句が実行されました。");
}
}
}


実行結果

スタート!

ほげほげ
finally句が実行されました。
Try句からのリターンです。

これでfinally句にreturnを書いては行けないと言われていた意味がよくわかった。


source-finally-return

public class Try {

public static void main(String[] args) {
String i=TryCatch();
System.out.println(i);
}

public static String TryCatch(){
System.out.println("スタート!");
String str = null;//nullにする
try{
str.toString(); //NullPointerException
System.out.println("ほげほげ");
return "Try句からのリターンです。";
}catch(Exception e){
System.out.println("ふがふが");
return "Catch句からのリターンです。";
}finally{
System.out.println("finally句が実行されました。");
return "例外を握りつぶしますね";//リターンをする
}
}
}


実行結果

スタート!

ふがふが
finally句が実行されました。
例外を握りつぶしますね

本来ならcatch句の実行→finally句の実行→catch句のreturnで、catch句の文字列が出力されるはずが

finally句のretrunによってcatchのreturnが実行されなくなっている。

そうすると、戻ってきた結果が例外処理が起こったのか、正常な処理で終わったのか判別つかなくなる。

ちなみに、Eclipseだとfinally句の中のreturnは

finally ブロックは正常に完了しません

と警告が出る。