最近遇到一道關于java中try-catch代碼塊執行順序的問題。
話不多說,先上一段代碼:
public class Main_1 {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int a = 0;
try{
a=1;
return a;
}catch(Exception e){
}finally{
a=2;
}
}
}
輸出結果.jpg
從結果上看,貌似finally 里的語句是在return之后執行的,其實不然,實際上finally 里的語句是在在return之前執行的。那么問題來了,既然是在之前執行,那為什么a 的值沒有被覆蓋了?
實際過程是這樣的:當程序執行到try{}語句中的return方法時,它會干這么一件事,將要返回的結果存儲到一個臨時棧中,然后程序不會立即返回,而是去執行finally{}中的程序, 在執行a = 2時,程序僅僅是覆蓋了a的值,但不會去更新臨時棧中的那個要返回的值 。執行完之后,就會通知主程序“finally的程序執行完畢,可以請求返回了”,這時,就會將臨時棧中的值取出來返回。這下應該清楚了,要返回的值是保存至臨時棧中的。
我們再看下面一段代碼:
public class Main_1 {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int a = 0;
try{
a=1;
return a;
}catch(Exception e){
}finally{
a=2;
return a;
}
}
}
輸出結果.jpg
在這里,finally{}里也有一個return,那么在執行這個return時,就會更新臨時棧中的值。同樣,在執行完finally之后,就會通知主程序請求返回了,即將臨時棧中的值取出來返回。故返回值是2.
那么我們大體上可以總結如下:
1.finally{}代碼塊比return先執行、
2.有多個return時是按順序執行的,但只要執行了一個,后面的return就都不會執行了