try-catch語句中有return語句,finally代碼塊會執行嗎?

直接以代碼爲例說明: 

@Slf4j
public class Demo {

    public Demo() {
    }

    public int method() {
        int a = 10;
        try {
            int b = 10 / 0;
            return b;
        } catch (Exception e) {
            log.info("進入catch語句.....");
            a = 20;
            return a;
        } finally {
            /*finally中的代碼主要是釋放資源*/
            log.info("進入finally語句.....");
            a = 30;
            /*return a;  這種寫法是錯誤的!!*/
        }
    }
}
@Slf4j
public class CatchException {
    public static void main(String[] args){
        Demo d = new Demo();
        System.out.println(d.method());
    }
}

程序運行結果:

進入catch語句.....

進入finally語句.....

20

分析:
從結果可以看出,finally中代碼被執行了,但是爲什麼返回20,而不是返回30?
當程序執行到try中輸出語句,會產生異常,被catch捕捉到,a=20執行,在執行return時,return 先建立好一個返回路徑,把a=20打包好,然後執行finally中的代碼,a=30被執行了,但是return的返回路徑已確定,所以不會返回30,finally中的代碼主要是釋放資源,
執行a=30這種代碼沒有意義,在執行玩finally代碼後,最後按照return的返回路徑返回。如果在finally中寫上return,會覆蓋掉之前在catch中的返回路徑,直接返回30,但是這樣寫前邊try和catch就沒有任何意義了,程序最終就會返回finally中return,所以這種寫法是錯誤的。

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