tryについて...catch...finallyのreturnの疑惑

5115 ワード

tryについて...catch...finallyのreturnはずっと面接の人気試験点です.以下のいくつかの状況に分けられます.
1、finally文があり、tryにreturnがあり、return(まだ実行されていない)に実行されると、finallyの内容が先に実行され、行tryのreturnが実行されます.
package com.and.java.demo;

public class   {
    public static void main(String[] args) {
        System.out.println(new  ().test());
    }

    public String test() {
        try {
            System.out.println("try{...}");
            return "try";
        } catch (Exception e) {
            System.out.println("catch{...}");
            return "catch";
        } finally {
            System.out.println("finally{...}");
        }
    }
}

出力:
try{...}
finally{...}
try

2、1に基づいて、finallyにもreturn文がある場合、tryコードブロックのreturnはブロックされ(実行されない)、すなわちtryでreturnに遭遇した場合、finallyの内容(finallyのreturn文を含む)が先に実行される.
package com.and.java.demo;

public class   {
    public static void main(String[] args) {
        System.out.println(new  ().test());
    }

    public String test() {
        try {
            System.out.println("try{...}");
            return "try";
        } catch (Exception e) {
            System.out.println("catch{...}");
            return "catch";
        } finally {
            System.out.println("finally{...}");
            return "finally";
        }
    }
}

出力:
try{...}
finally{...}
finally

問題:
この二つの状況はきっとみんなが把握しているに違いない.しかし、もう一つの状況は、私には理解できないところです.一般的に、finallyでデータの閉じる操作(ファイル、入出力ストリーム、データベースの閉じるなど)を行い、finallyで返す値を修正すると、最終的な結果に反応しますか?(上記の説明から分かるように、tryにreturnがある場合、すぐに実行されず、finallyの内容を先に実行してからreturnを実行します).
package com.and.java.demo;

public class   {
    public static void main(String[] args) {
        System.out.println(new  ().test());
    }

    public String test() {
        String result = "";
        try {
            result = "try";
            return result;
        } catch (Exception e) {
            result = "catch";
            return result;
        } finally {
            result = "finally";
        }
    }
}

考えてみれば、「try」と「finally」のどちらが出力されますか?
出力:
try
確かにtryしか出力されませんが、finallyではresultの値を変更しましたか?さらに改善してfinallyの付与文が実行されるかどうかを判断する
package com.and.java.demo;

public class   {
    public static void main(String[] args) {
        System.out.println(new  ().test());
    }

    public String test() {
        String result = "";
        try {
            result = "try";
            return result;
        } catch (Exception e) {
            result = "catch";
            return result;
        } finally {
            System.out.println("t1->"+result);
            result = "finally";
            System.out.println("t2->"+result);
        }
    }
}

出力:
t1->try
t2->finally
try

出力結果からfinallyの付与文は実行されていることがわかりますが、return結果ではどうして変わらないのでしょうか.(今のところしばらくここまで研究していますが、まだ分かりません.皆さんのご指導をお願いします)