LoginSignup
171
121

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-28

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

171
121
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
171
121