这个题目今天面试的时候笔试题里面有,很简单,以前第一次找工作的时候也被问到了,当时回答得领面试官挺满意的,但是怎么回答的印象有点模糊了,晚上感觉什么都看不下去,所以就写了点代码验证了一下,要是不写代码验证,可能只能说出一个领自己都不那么肯定的结果
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是不会执行的。