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