首頁 > Java > java教程 > 為什麼 Java 異常處理程式碼會產生「132Exception in thread main MyExc1」而不是「13Exception in thread main MyExc2」?

為什麼 Java 異常處理程式碼會產生「132Exception in thread main MyExc1」而不是「13Exception in thread main MyExc2」?

Linda Hamilton
發布: 2024-10-29 18:38:12
原創
1025 人瀏覽過

Why does the Java exception handling code produce

Java 中的異常處理:解開歧義

在一個令人費解的Java 異常處理場景中,一個大學問題提出了以下程式碼片段:

<code class="java">// Exception Heirarchy
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

// Main Class
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」。

澄清歧義

要破解這個謎題,必須了解異常的優先順序:

  • 原理:
  • 原理:

      原理:
    • 原理:
    • 當catch 或finally 區塊中拋出新的例外狀況時,目前正在處理的例外狀況將會中止。
後果:

目前異常的傳播已停止。

新異常成為傳播異常。
  1. 新異常正常展開堆棧,遇到任何適用的 catch 或 finally 區塊。

    • 回溯執行
    • 將此原則應用於程式碼:
  2. 初始執行:

      第13 行:MyExc1 被拋出到q() 的try 區塊中。
    • 第 18 行: MyExc1 被 q() 的 catch 區塊捕捉。
    • 第 21 行:執行第 21 行(列印 3)。
  3. Catch 區塊異常:

      第19 行:MyExc2 被拋出到main() 的catch 區塊中。
    • 第 22 行:MyExc2 中止 MyExc1 的傳播。
    • 第 19 行:MyExc2 開始展開堆疊。
  4. 在Main 的Try 區塊中恢復執行:
  5. 第15 行:第15 行被執行(列印2)。

      第 16 行:MyExc1 被拋出到 main() 的finally 區塊中。
    • 第 16 行:MyExc1 中止 MyExc2 的傳播。
    • 第 16 行:MyExc1 開始展開堆疊(並且仍然受 main 的 finally 區塊的影響)。

Finally 區塊異常:

第 23 行:在 main() 的 finally 區塊中拋出。

第 23 行:異常中止 MyExc1 的傳播。 第23 行:異常開始展開輸出:
最終輸出是「132Exception in thread MyExc1”,因為傳播出去的異常main 方法的主方法是第16 行拋出的MyExc1。第 19 行拋出的 MyExc2 在第 16 行拋出 MyExc1 時中止。

以上是為什麼 Java 異常處理程式碼會產生「132Exception in thread main MyExc1」而不是「13Exception in thread main MyExc2」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板