面試準備之finally和return代碼的執行時機

這個題目今天面試的時候筆試題裏面有,很簡單,以前第一次找工作的時候也被問到了,當時回答得領面試官挺滿意的,但是怎麼回答的印象有點模糊了,晚上感覺什麼都看不下去,所以就寫了點代碼驗證了一下,要是不寫代碼驗證,可能只能說出一個領自己都不那麼肯定的結果

import org.junit.Test;

/**
 *
 * 測試要是有return的話,finally裏面的代碼是否執行
 * @Author wangbiao
 * @Date 2019-11-29 19:54
 * @Decripition TODO
 **/
public class FinallyReturn {

    /**
     * 在finally裏面改變return要返回的值,最終結果發現改變沒有效果
     * @param a
     * @param b
     * @return
     */
    public int addOne(int a,int b){
        int sum = 0;
         try{
             sum = a+b;
             System.out.println("return被執行之前 sum:"+sum);
             return sum;
         }finally {
             sum = a - b;
             System.out.println("finally的代碼被執行了 sum:"+sum);
         }
    }

    /**
     * 改變return 正在執行的值,這個時候return 裏面還在計算,發現還是沒有效果,
     * 這說明是return 裏面的計算先執行,但是會將結果存起來,再來執行finally,
     * 所以finally執行就沒法作出改變
     * @param a
     * @param b
     * @return
     */
    public int addTwo(int a,int b){
        try{
            System.out.println("return被執行之前a:"+a+";b:"+b);
            return a+b;
        }finally {
            a = 2*a;
            b = 2*b;
            System.out.println("finally的代碼被執行了 a:"+a+";b:"+b);
        }
    }

    /**
     * 比較fiannly裏面的return先執行還是try裏面的return先執行,發現是try裏面的先執行
     * @param a
     * @param b
     * @return
     */
    public int addThree(int a,int b){
        try{
            System.out.println("return被執行之前a:"+a+";b:"+b);
            return a+b;
        }finally {
            a = 2*a;
            b = 2*b;
            System.out.println("finally的代碼被執行了 a:"+a+";b:"+b);
            return a+b;
        }
    }

    @Test
    public void test(){
        int a =11;
        int b =29;
        int sum = this.addOne(a,b);
        System.out.println("addOne方法的返回值:"+sum);

        System.out.println("------------------分割線------------------");

        int sumTwo = this.addTwo(a,b);
        System.out.println("addTwo方法的返回值:"+sumTwo);

        System.out.println("------------------分割線------------------");

        int sumThree = this.addThree(a,b);
        System.out.println("addTwo方法的返回值:"+sumThree);

    }


}

執行結果:

eturn被執行之前 sum:40
finally的代碼被執行了 sum:-18
addOne方法的返回值:40
------------------分割線------------------
return被執行之前a:11;b:29
finally的代碼被執行了 a:22;b:58
addTwo方法的返回值:40
------------------分割線------------------
return被執行之前a:11;b:29
finally的代碼被執行了 a:22;b:58
addTwo方法的返回值:80

得出結論:

1.finally裏面的代碼會在return之前,但是如果return裏面是一個計算公式或者是調用某一個方法的話,那先執行reurn 的計算公式或者方法,再執行finally裏面的代碼,finally執行對return的結果無法改變的,但是如果return 返回的是一個對象的話,那麼在finally裏面對返回對象作出改變的話,return結果是會被改變的

2.如果finally裏面有return代碼,那先執行finally 裏面的return,try裏面的return是不會執行的。

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