>  기사  >  Java  >  finally 블록에서 발생한 예외가 Java에서 최종적으로 보고되는 예외인 이유는 무엇입니까?

finally 블록에서 발생한 예외가 Java에서 최종적으로 보고되는 예외인 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 15:56:02956검색

Why is the exception thrown in the finally block the one that is ultimately reported in Java?

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(); // throws MyExc1 here
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1(); // throws MyExc1 here
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception(); // throws Exception here
        }
    }
}

이 스니펫에는 try-catch 절과 finally 절 모두에서 일련의 예외가 발생합니다. 예상되는 출력은 "스레드 메인 MyExc2의 13Exception"이 아니라 "스레드 메인 MyExc1의 132Exception"입니다.

이 결과를 이해하려면 Java 예외 처리의 기본 원칙을 이해해야 합니다.

해당 블록 외부로 전파되는 catch 또는 finally 절 내에서 새 예외가 발생하면 현재 예외가 중단되고 대신 새 예외가 전파됩니다.

기본적으로 현재 예외는 잊어버립니다. 그리고 새로운 예외가 스택의 해제 프로세스를 인계받습니다.

주어진 코드에서 MyExc1 예외는 가장 안쪽의 finally 절에서 발생합니다. 이 예외는 결국 기본 finally 절까지 버블링됩니다. 그러나 해당 finally 절에서는 또 다른 예외인 MyExc1이 발생하여 원본 MyExc1의 전파가 중단됩니다. 따라서 가장 바깥쪽 finally 절의 MyExc1이 외부로 전파되는 예외가 됩니다.

위 내용은 finally 블록에서 발생한 예외가 Java에서 최종적으로 보고되는 예외인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.