首頁 > Java > java教程 > 主體

為什麼在這個 Java 異常處理範例中「MyExc2」異常消失了?

Susan Sarandon
發布: 2024-10-30 10:08:02
原創
405 人瀏覽過

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example?

Catch 和Final 子句中的異常處理

在Java 中處理異常處理時,掌握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();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}</code>
登入後複製

要求此程式碼輸出的問題。雖然有些人可能回答“13Exception in thread main MyExc2”,但正確答案是“132Exception in thread main MyExc1”。

為什麼 MyExc2 消失

理解的關鍵正確的輸出在於catch 和finally 子句的行為。當 catch 或 finally 區塊中引發異常時,它會對流程產生重大影響。以下是細分:

  • catch 區塊中的例外: 如果在catch 區塊中拋出新例外(如上面的throw new MyExc2() 所示),則原始異常為「中止了。」目前的執行路徑不完整,新的異常將接替向外傳播的異常。
  • finally 區塊中的異常: 類似地,如果在一個finally區塊,原來的異常也被中止。不過,有一個關鍵點要注意:

    • Catch 區塊的finally 區塊: 如果新的例外是在catch 區塊的finally 區塊中拋出的,它仍然會受到該catch 區塊的約束。 finally 區塊,如果有的話。

追蹤異常

根據這些原則追蹤執行,我們可以看到:

    main
  1. main
  2. main
  3. main
  4. main
  5. main
  6. main
  7. main
  8. main
  9. main

    mainmain中的try 區塊列印“1”並呼叫q()。

    在 q() 內部,try 區塊拋出 MyExc1。
    • catch 區塊in q() 默默地處理異常。
    • q() 中的 finally 區塊列印「3」並拋出異常。
  10. main 中的 Catch 區塊:

    MyExc2 被拋出到這個區塊中,中止原來的 MyExc1。
    • 但是,catch 區塊有一個仍然執行的 finally 區塊。

最後在 main 中的區塊:MyExc1 被拋出到這個區塊中,中止 MyExc2。 因此,正確的輸出是「132Exception in thread main MyExc1」。 MyExc2 異常被“遺忘”,因為在處理 MyExc2 的 catch 區塊的 finally 區塊中拋出了一個新異常 (MyExc1)。

以上是為什麼在這個 Java 異常處理範例中「MyExc2」異常消失了?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!