Java 中的異常處理:了解Catch 和Final 子句中引發的異常的影響
考慮以下程式碼片段:
class MyExc1 extends Exception {} class MyExc2 extends Exception {} class MyExc3 extends MyExc2 {} public class C1 { public static void main(String[] args) throws Exception { try { System.out.print(1); q(); } catch (Exception i) { throw new MyExc2(); } finally { System.out.print(2); throw new MyExc1(); // throws MyExc1 here } } static void q() throws Exception { try { throw new MyExc1(); // throws MyExc1 here } catch (Exception y) { } finally { System.out.print(3); throw new Exception(); // throws Exception here } } }
在此程式碼片段中,我們在try-catch 和finally 子句中拋出了一系列異常。預期輸出是“132Exception in thread main MyExc1”,而不是“13Exception in thread main MyExc2”。
理解這個結果需要理解Java 中異常處理的基本原理:
當從該區塊傳播出去的catch 或finally 子句中引發新異常時,當前異常將被中止,並傳播新異常。
本質上,當前異常被遺忘,新的異常接管堆疊上的展開過程。
在給定的程式碼中,在最裡面的finally子句中拋出了MyExc1異常。這個異常最終會冒泡到主finally子句。然而,在該finally子句中,拋出了另一個異常MyExc1,中止原始MyExc1的傳播。因此,最外面的finally子句的MyExc1成為向外傳播的異常。
以上是為什麼Java中最終報告的異常是finally區塊中拋出的異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!