"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 이 Java 예외 처리 예제에서 `MyExc2` 예외가 사라지는 이유는 무엇입니까?

이 Java 예외 처리 예제에서 `MyExc2` 예외가 사라지는 이유는 무엇입니까?

2024-11-04에 게시됨
검색:289

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

Catch 및 finally 절의 예외 처리

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

이 코드의 출력에 대해 묻는 질문입니다. 일부에서는 "스레드 메인 MyExc2의 13예외"라고 대답했을 수도 있지만 정답은 "스레드 메인 MyExc1의 132예외"입니다.

MyExc2가 사라지는 이유

이해의 열쇠 올바른 출력은 catch 및 finally 절의 동작에 있습니다. catch 또는 finally 블록 내에서 예외가 발생하면 흐름에 중요한 영향을 미칩니다. 분석은 다음과 같습니다.

  • catch 블록의 예외: catch 블록에서 새 예외가 발생하는 경우(위의 throw new MyExc2()에서 볼 수 있듯이) 원래 예외는 다음과 같습니다. "중단되었습니다." 현재 실행 경로는 불완전한 상태로 남아 있으며 새로운 예외가 외부로 전파되는 예외로 이어집니다.
  • finally 블록의 예외: 마찬가지로, 새로운 예외가 발생하는 경우 finally 블록이 있으면 원래 예외도 중단됩니다. 그러나 주의해야 할 중요한 점이 있습니다:

    • Catch 블록의 finally 블록: 새로운 예외가 catch 블록의 finally 블록에서 발생하는 경우 여전히 해당 catch의 영향을 받습니다. 마지막으로 차단합니다.

예외 추적

이러한 원칙을 기반으로 실행을 추적하면 다음을 확인할 수 있습니다.

  1. 메인의 try 블록은 "1"을 인쇄하고 q()를 호출합니다.
  2. q() 내부의 try 블록은 MyExc1을 발생시킵니다.
  3. catch 블록 q()에서 예외를 자동으로 처리합니다.
  4. q()의 finally 블록은 "3"을 인쇄하고 예외를 발생시킵니다.
  5. main의 Catch 블록:

    • MyExc2가 이 블록에 던져져 원래 MyExc1을 중단합니다.
    • 그러나 catch 블록에는 여전히 실행되는 finally 블록이 있습니다.
  6. 마지막으로 메인 블록:

    • MyExc1이 이 블록에 던져져 MyExc2가 중단됩니다.

따라서 올바른 출력은 "스레드 메인 MyExc1의 132Exception"입니다. MyExc2 예외는 MyExc2를 처리하던 catch 블록의 finally 블록에서 새로운 예외(MyExc1)가 발생하기 때문에 "잊혀졌습니다".

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3