Java-try_catch_finally中帶有return語句的執行順序

我們知道,在try_catch_finally塊對異常進行捕捉時,一定會執行到finally塊中的語句。看下面例子:


Test1:(try語句中有return,finally中沒有)

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

    public static int test() {
        int num = 10;
        try {
            System.out.println("try");
            return num += 50;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (num > 50) {
                System.out.println("num=" + num);
            }
            System.out.println("finally");
        }
        return num + 20;
    }
}

執行結果:

try
num=60
finally
60

Test2:(try和finally語句中均有return語句)

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

    @SuppressWarnings("finally")
    public static int test() {
        int num=10;
        try{
            System.out.println("try");
            return num+=50;
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(num>50){
                System.out.println("num="+num);
            }
            System.out.println("finally");
            return num+20;
        }           
    }
}

執行之後的結果:

try
num=60
finally
80

可以看出,在try語句塊中,return num+=50分成了兩條語句執行,num=num+50和return num;而這裏只執行了num=num+50這句,然後進入finally塊,最後在finally塊中進行return.在finally塊中有return語句的時候,會覆蓋掉try語句中的return語句。


Test3(finally語句塊中修改變量的值)

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

    public static int test() {
        int num = 10;
        try {
            System.out.println("try");
            return num += 50;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (num > 50) {
                System.out.println("num=" + num);
            }
            System.out.println("finally");
            num+=30;
                //return num; 加這句可以返回改變後的值
        }
        return num + 20;
    }
}

執行結果:

try
num=60
finally
60

這裏可以看出,在final語句塊中,num+=30執行後再try語句塊中的return似乎並沒有“感受”到。


Test4(finally語句塊中修改引用變量的值)

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

    public static Num test() {
        Num num=new Num();
        try {
            System.out.println("try");
            return  num;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (num.n > 50) {
                System.out.println("num.n=" + num.n);
            }
            System.out.println("finally");
            num.n=200;
        }
        return num;
    }   
}
class Num{
       public int n=10;
}

執行後結果:

try
finally
200

總結:
1)若try語句塊中有return,finally語句塊中沒有,則執行完try中的語句,然後執行finally語句中的語句,最後執行try中的return
2)若try語句塊和finally語句塊中均有return語句,則執行完try語句後,進入finally塊,然後執行finally塊中的return語句。
3)若try語句塊中有return,在finally語句中修改變量值時,如修改的爲值類型的數據,則在try語句塊中相當於是不可見的,而如果是引用類型的值,則在try語句塊中是可見的。

發佈了76 篇原創文章 · 獲贊 48 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章