首頁  >  文章  >  Java  >  為什麼Java中最終報告的異常是finally區塊中拋出的異常?

為什麼Java中最終報告的異常是finally區塊中拋出的異常?

Linda Hamilton
Linda Hamilton原創
2024-10-31 15:56:02875瀏覽

Why is the exception thrown in the finally block the one that is ultimately reported in Java?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn