」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼在這個 Java 異常處理範例中「MyExc2」異常消失了?

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

發佈於2024-11-04
瀏覽:386

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

Catch 和Final 子句中的異常處理

在Java 中處理異常處理時,掌握catch 和finally 子句之間的相互作用至關重要。考慮以下提供大學作業的範例:

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

詢問此程式碼的輸出的問題。雖然有些人可能回答“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 區塊中拋出,它仍然會受到該catch塊的約束。最後塊,如果有的話。

追蹤異常

  1. 根據這些原則追蹤執行,我們可以看到:
  2. main中的try 區塊列印“1”並呼叫q()。
  3. 在 q() 內部,try 區塊拋出一個 MyExc1.
  4. catch 區塊in q() 默默地處理異常。
  5. q() 中的finally 區塊列印「3」並拋出異常。

      main 中的Catch 區塊:
    • MyExc2 被拋出到這個區塊中,中止原來的 MyExc1。
  6. 但是,catch 區塊有一個仍然執行的 finally 區塊。
    • 最後在 main 中的區塊:
  7. MyExc1 被拋出到這個區塊中,中止 MyExc2。

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example? 
因此,正確的輸出是「132Exception in thread main MyExc1」。 MyExc2 異常被“遺忘”,因為在處理 MyExc2 的 catch 區塊的 finally 區塊中引發了新異常 (MyExc1)。

最新教學 更多>

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

Copyright© 2022 湘ICP备2022001581号-3