我的結論是:Return是在finally中間執行。即finally語句是在try的return語句執行之後,return返回之前執行
原因如下,先看代碼
public static void main(String[] args) {
System.out.println("最終i爲:"+returnTest());
}
/**
*
* 在執行到return的時候:先把i=0的值拿來用,放到返回通道上,但是並沒有真實返回;然後執行了i++命令使i=1;
* 然後再執行finally裏面的函數,此時i=1;再finally中再執行i++命令,使i=2;
*/
private static Integer returnTest() {
int i=0;
try{
return i++;
}catch (Exception e){
e.printStackTrace();
}finally {
i++;
System.out.println("finally:"+i);
}
return -1;
}
最終結果爲:
finally:2
最終i爲:0
由上可知,我們在執行return的時候是先使用了原始“i=0”的值,然後再執行“i++”,最後再執行的是finally代碼塊裏面的代碼。所以會造成finally的System.out.println()輸出i=2,而main方法裏面的System.out.println()輸出的值爲i=0;
所以我們爲了更加形象的表示整個過程可以把try代碼塊裏面的return這一過程分爲三步,分別是:1、try裏面的return先將data放在電梯底部,但是try沒有通電權限;2、待finally裏面代碼塊執行完畢後爲電梯通電;3、電梯通電後,啓動運行將數據data傳送出去,結束本次流程。
即: return是先把要返回的值拿來用,把要返回的data放在管道上,然後再執行finally代碼塊裏面的代碼,最後執行完畢後再返回管道中的值。
注意:一、此圖僅僅是爲了說明try和finally裏面的return執行流程(如果都沒有finally,此圖不適用)。二、如果在try裏面的不是return而是System.exit(0)那麼此時finally是不會被執行的。因爲System.exit(0)是終止Java虛擬機JVM運行,所以JVM停止運行,自然System.exit(0)後面所有代碼都不會再運行。