大忙人系列面試題:證明Return是在finally中間執行還是在return之後執行

 我的結論是: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)後面所有代碼都不會再運行

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章