2015-12-02 59 views
0

我最近在一次採訪中詢問了在java中執行異常情況的順序,如果異常未被捕獲並傳播回調用代碼,最後是塊,然後打印最後的塊語句? 如果他們是,那麼他們打印之前或之後打印?爲什麼在最後的block/s執行時出現不一致的情況

我試圖運行這種情況,發現輸出不一致。

我嘗試的代碼是:

公共類FinallyExecution {

public static void main(String[] args) { 

    try{ 

     FinallyExecution.divide(100, 0); 

    }finally{ 
     System.out.println("finally in main"); 
    } 

} 

public static void divide(int n, int div){ 

    try{ 
     int ans = n/div; 
    } 
    finally{ 
     System.out.println("finally of divide"); 
    } 
} 

}

而不一致輸出爲:

一次:

Exception in thread "main" java.lang.ArithmeticException:/by zero at exceptions.FinallyExecution.divide(FinallyExecution.java:20) at exceptions.FinallyExecution.main(FinallyExecution.java:9) finally of divide finally in main

和未來:

finally of divide finally in main Exception in thread "main" java.lang.ArithmeticException:/by zero at exceptions.FinallyExecution.divide(FinallyExecution.java:20) at exceptions.FinallyExecution.main(FinallyExecution.java:9)

那麼究竟是什麼在這種情況下發生? JVM是否正在執行finally塊,然後退出異常,還是以相反的順序? 無論哪種情況,爲什麼輸出不一致?

+1

可能是一個更好的重複:http://stackoverflow.com/questions/33189792/try-catch-finally-order-of-execution-appears-to-be-random –

回答

1

您正在打印到System.out而未捕獲的異常堆棧跟蹤將打印到System.err。您可以在控制檯中看到兩個內容,但是按照哪個順序未定義。

如果您將調試打印更改爲使用System.err那麼順序是一致的。

+0

這解釋了不一致。謝謝 – Prajakta

相關問題