我最近在一次採訪中詢問了在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塊,然後退出異常,還是以相反的順序? 無論哪種情況,爲什麼輸出不一致?
可能是一個更好的重複:http://stackoverflow.com/questions/33189792/try-catch-finally-order-of-execution-appears-to-be-random –