> Java > java지도 시간 > 본문

MyExc2 예외가 catch 블록에 발생했음에도 불구하고 코드 조각이 \'132Exception in thread main MyExc1\' 출력을 생성하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-29 22:30:29
원래의
690명이 탐색했습니다.

Why does the code snippet produce the output

Catch 및 finally 블록의 예외 처리

최근 대학 Java 과제에서 한 학생이 다음 코드 조각을 접하고 예측하라는 요청을 받았습니다. 출력:

<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"이라는 사실을 알고 놀랐습니다.

Catch 및 finally 블록의 예외 전파 이해

올바른 출력을 이해하려면 catch 및 finally 블록 내의 예외 동작을 이해하는 것이 중요합니다. Java의 예외 처리 메커니즘에 따르면:

  1. 해당 블록 외부로 전파될 catch 또는 finally 블록 내에서 예외가 발생하면 현재 예외는 자동으로 중단되고 잊혀집니다.
  2. 새 예외는 스택을 풀기 시작하고 도중에 모든 catch 또는 finally 블록을 고수합니다.
  3. 특히, catch 블록에 던져진 새 예외는 여전히 해당 catch의 finally 블록(있는 경우)에 적용됩니다.

예외 흐름 추적

이를 염두에 두고 코드 조각의 실행을 단계별로 추적해 보겠습니다.

  • 프로그램은 main 메소드에서 시작하고 "1"을 인쇄합니다.
  • q 메소드에서 예외가 발생하고 main의 catch 블록에 의해 포착됩니다.
  • catch 블록 내에서 새로운 예외, MyExc2가 발생했습니다. 이렇게 하면 원래 예외인 MyExc1이 중단됩니다.
  • MyExc2 예외는 catch 블록에서 finally 블록으로 전파됩니다.
  • finally 블록은 "2"를 인쇄합니다. 그러나 q 메소드를 종료하기 전에 finally 블록은 스택 해제를 시작하는 새로운 예외를 발생시킵니다.
  • 새로운 예외는 q 메소드의 catch 블록에서 포착되지 않는 예외입니다.
  • 예외 예외는 q 메소드에서 메인 메소드의 finally 블록으로 전파됩니다.
  • 메인의 finally 블록은 "3"을 인쇄한 다음 MyExc1 예외를 발생시킵니다.
  • MyExc1 예외는 기본 메서드 외부로 전파되어 가상 머신에 의해 포착됩니다.

출력 이해

이 추적을 통해 다음을 확인할 수 있습니다.

  • 메인 메서드 외부로 전파되는 마지막 예외는 MyExc1입니다.
  • 스택 추적에는 프로그램에서 인쇄한 출력에 해당하는 "132"가 포함됩니다.

따라서 올바른 출력은 "132Exception in thread main MyExc1"입니다.

위 내용은 MyExc2 예외가 catch 블록에 발생했음에도 불구하고 코드 조각이 \'132Exception in thread main MyExc1\' 출력을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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