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 ブロックは正常に完了しません
と警告が出る。