Java中finally塊到底是在return之前執行還是return之後執行?

網上有很多人探討Java中異常捕獲機制try…catch…finally塊中的finally語句是不是一定會被執行?很多人都說不是,當然他們的回答是正確的,經過我試驗,至少有5種情況下finally語句是不會被執行的:
(1)try語句沒有被執行到,如在try語句之前就返回了,這樣finally語句就不會執行,這也說明了finally語句被執行的必要而非充分條件是:相應的try語句一定被執行到。
(2)在try塊中有System.exit(0);這樣的語句,System.exit(0);是終止Java虛擬機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。
(3)在finally語句塊中發生了異常。
(4)程序所在的線程死亡。
(5)關閉CPU。
1.finally語句是在try的return語句執行之後,return返回之前執行

public class FinallyTest1 {

    public static void main(String[] args) {
        
        System.out.println(test1());
    }

    public static int test1() {
        int b = 20;

        try {
            System.out.println("try block");

            return b += 80; 
        }
        catch (Exception e) {

            System.out.println("catch block");
        }
        finally {
            
            System.out.println("finally block");
            
            if (b > 25) {
                System.out.println("b>25, b = " + b);
            }
        }
        
        return b;
    }
    
}

運行結果是:

try block
finally block
b>25, b = 100
100

說明return語句已經執行了再去執行finally語句,不過並沒有直接返回,而是等finally語句執行完了再返回結果。
2. finally塊中的return語句會覆蓋try塊中的return返回。
3. 如果finally語句中沒有return語句覆蓋返回值,那麼原來的返回值可能因爲finally裏的修改而改變也可能不變。
4. try塊裏的return語句在異常的情況下不會被執行,這樣具體返回哪個看情況。
5. 當發生異常後,catch中的return執行情況與未發生異常時try中return的執行情況完全一樣。
最後總結:finally塊的語句在try或catch中的return語句執行之後返回之前執行且finally裏的修改語句可能影響也可能不影響try或catch中 return已經確定的返回值,若finally裏也有return語句則覆蓋try或catch中的return語句直接返回。

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