」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 Java 異常處理程式碼會產生「132Exception in thread main MyExc1」而不是「13Exception in thread main MyExc2」?

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

發佈於2024-11-06
瀏覽:742

Why does the Java exception handling code produce \

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

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();
        }
    }
}

//異常層次結構 類別 MyExc1 擴充異常 {} 類別 MyExc2 擴充異常 {} 類別 MyExc3 擴充 MyExc2 {} // 主類 公共課 C1 { 公共靜態無效主(字串[] args)拋出異常{ 嘗試 { 系統.out.print(1); q(); } 捕獲(異常我){ 拋出新的 MyExc2(); } 最後 { 系統.out.print(2); 拋出新的 MyExc1(); } } static void q() 拋出例外狀況 { 嘗試 { 拋出新的 MyExc1(); } 捕獲(異常 y){ } 最後 { 系統.out.print(3); 拋出新的異常(); } } }

問題詢問其輸出,提供的答案是「13Exception in thread main MyExc2」。然而,正確的答案是「132Exception in thread main MyExc1」。

澄清歧義

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

    當catch或finally區塊中拋出新的例外狀況時,目前正在處理的例外狀況將被中止。

      後果:
    • 當前異常的傳播停止。
    • 新異常成為傳播異常。
  • 新異常正常展開堆棧,遇到任何適用的 catch 或 finally 區塊。

追溯執行

  1. 將此原則應用於代碼:

      初始執行
    • :
    • 第13 行: MyExc1 被拋出到q() 的try 區塊中。
    • 第 18 行: MyExc1 被 q() 的 catch 區塊捕捉。
  2. 第 21 行:執行第 21 行(列印 3)。
    • Catch 區塊異常:
    • 第19 行:MyExc2 被拋出到main() 的catch 區塊中。
    • 第 22 行:MyExc2 中止 MyExc1 的傳播。
  3. 第 19 行:MyExc2 開始展開堆疊。
    • Main 的Try 區塊中恢復執行:
    • 第15 行:第15 行被執行(列印2 )。
    • 第 16 行:MyExc1 被拋出到 main() 的finally 區塊中。
    • 第 16 行:MyExc1 中止 MyExc2 的傳播。
  4. 第16行:MyExc1開始展開堆疊(並且仍受main的finally區塊的影響)。
    • Finally Block異常:
    • 第 23 行:在 main() 的 finally 區塊中拋出異常。
    • 第 23 行:異常中止 MyExc1 的傳播。
  5. 第23 行:異常開始展開

輸出:

Why does the Java exception handling code produce \最終輸出是「132Exception in thread main MyExc1”,因為傳播出去的異常main 方法的主方法是第16 行拋出的MyExc1。第 19 行拋出的 MyExc2 在第 16 行拋出 MyExc1 時中止。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3