首頁  >  文章  >  Java  >  當 Java 中的 catch 和 finally 區塊中拋出異常時,異常傳播如何運作?

當 Java 中的 catch 和 finally 區塊中拋出異常時,異常傳播如何運作?

Patricia Arquette
Patricia Arquette原創
2024-11-02 20:09:03822瀏覽

How does exception propagation work when exceptions are thrown within catch and finally blocks in Java?

Catch 和Final 區塊中的異常傳播

在Java 程式中,當發生異常時,它會透過堆疊處理為止通過合適的catch 區塊或終止程序。但是,異常也可以在 catch 或 finally 區塊中引發,從而引發有關其傳播行為的問題。

考慮以下程式碼片段:

<code class="java">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(); // Exception thrown in catch block
        }
        finally {
            System.out.print(2);
            throw new MyExc1(); // Exception thrown in finally block
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception(); // Exception thrown in finally block
        }
    }
}</code>

當在catch 或finally 區塊中引發異常時finally 區塊中,適用以下原則:

異常覆蓋: 如果在catch 或finally 區塊中拋出一個新的異常,並且打算傳播到該區塊之外,則當前異常正在處理中將被中止,新的異常將向外傳播,取代它的位置。中止的異常將被丟棄。

在提供的程式碼中,catch 和finally 區塊中的異常場景示範了這個原理:

  • Catch 區塊:當catch 區塊內拋出異常i 時,它立即被新異常MyExc2 替換,成為正在進行的異常。
  • Finally Block: 同樣,當拋出異常時在finally塊中,它用MyExc1替換了當前的MyExc2異常,使其成為正在進行中的新異常。

因此,當程式執行到展開堆疊後的main方法時,MyExc2異常已被 MyExc1 覆蓋,隨後被列印和處理。因此,正確的輸出是「132Exception in thread main MyExc1.」

以上是當 Java 中的 catch 和 finally 區塊中拋出異常時,異常傳播如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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