"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Java 예외 처리 코드가 \"스레드 메인 MyExc2\"의 13Exception 대신 \"스레드 메인 MyExc1\"의 132Exception을 생성하는 이유는 무엇입니까?

Java 예외 처리 코드가 \"스레드 메인 MyExc2\"의 13Exception 대신 \"스레드 메인 MyExc1\"의 132Exception을 생성하는 이유는 무엇입니까?

2024-11-06에 게시됨
검색:770

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

질문에서 출력을 요청했으며 제공된 답변은 "13Exception in thread main MyExc2"였습니다. 그러나 정답은 "132Exception in thread main MyExc1"입니다.

모호성 명확화

이 퍼즐을 해독하려면 예외의 우선 순위를 이해하는 것이 중요합니다.

  • 원리: catch 내에서 새로운 예외가 발생하는 경우 또는 마지막으로 차단하면 처리 중인 현재 예외가 중단됩니다.
  • 결과:

    • 현재 예외의 전파가 중단됩니다.
    • 새 예외는 전파 예외가 됩니다.
    • 새 예외는 정상적으로 스택을 해제하여 적용 가능한 예외를 만나게 됩니다. catch 또는 finally 차단.

실행 재추적

이 원칙을 코드에 적용:

  1. 초기의 실행:

    • 13행: MyExc1이 q()의 try 블록에 발생합니다.
    • 18행: MyExc1이 q()의 catch 블록에 발생합니다. .
    • Line 21: Line 21이 실행됩니다(인쇄 3).
  2. Catch 블록 예외:

    • 19행: MyExc2는 main( ).
    • 22행: MyExc2는 전파를 중단합니다. MyExc1.
    • 19행: MyExc2가 스택 해제를 시작합니다.
  3. Main의 Try 블록에서 실행이 다시 시작됩니다.

    • Line 15: Line 15가 실행됩니다(인쇄 2).
    • 16행: MyExc1이 main()의 finally 블록에 발생합니다.
    • 16행: MyExc1이 MyExc2의 전파를 중단합니다.
    • 16행: MyExc1 스택을 풀기 시작합니다(그리고 여전히 메인의 마지막 block).
  4. Finally Block Exception:

    • Line 23: main(의 finally 블록에서 예외가 발생합니다. ).
    • 23행: 예외로 인해 전파가 중단됩니다. MyExc1.
    • Line 23: 예외가 스택 해제를 시작합니다.

출력:

최종 출력 메인 메소드 밖으로 전파되는 예외는 라인에서 던져진 MyExc1이기 때문에 "스레드 메인 MyExc1의 132Exception"입니다. 16. 19번째 라인에 던져진 MyExc2는 16번째 라인에서 MyExc1이 던져지면 중단됩니다.

최신 튜토리얼 더>

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

Copyright© 2022 湘ICP备2022001581号-3