面试准备之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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章