> Java > java지도 시간 > 본문

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

Susan Sarandon
풀어 주다: 2024-10-30 10:08:02
원래의
473명이 탐색했습니다.

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

Catch 및 finally 절의 예외 처리

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>
로그인 후 복사

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

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가 중단됩니다.

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

위 내용은 이 Java 예외 처리 예제에서 `MyExc2` 예외가 사라지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿