2010-05-06 4 views
3

method1이 예외를 throw하는 예외 체인이 method2 인 경우 예외가 main이됩니다. 어떤 이유에서 컴파일러는 method2의 오류를 처리하도록 강요하며, 그렇지 않으면 오류로 표시하여 검사 된 예외임을 나타냅니다. 그러나 동일한 Exceptionmain의 행 아래로 던져지면 컴파일러는이를 무시하고 오류를 표시하지 않습니다.여러 번 던진 예외가 확인되었거나 런타임에 있습니까?

method1의 원래 예외는 확인 된 ParseException입니다. 그러나이 메소드에는 헤더에 일반 throws Exception 절이 있으며 동일한 객체가 method2에 던져지며 동일한 throws Exception 절이 있습니다. 이 Exception은 컴파일러에 의해 체크/캐치되는 상태를 언제, 어떻게 상실합니까?

편집은 명확하게 :

편집
public void method1() throws Exception{ 
    // code that may generate ParseException 
} 

public void method2() throws Exception{ 
    method1(); //compiler error (if the throws clause is left out) 
} 

public static void main(String[] args){ 
    method2(); //ignored by compiler, even though the exception isn't caught or thrown or handled at all 
} 

: 죄송합니다 모두, 문제는 실수에 기반 ... 주요 방법은 실제로 내가 실종 된 throws Exception 절을했다. 코드를 제거 했으므로 코드가 예상대로 작동합니다. 모든 도움에 감사드립니다!

+1

설명해 주시겠습니까? method1은 method2와 main에 의해 'Exception'으로 취급되는 'ParseException'을 던집니까? 일부 메소드 서명과 try-catch-throw 코드 스 니펫이 도움이됩니다. – justkt

+1

코드는 10,000 단어의 가치가 있습니다. –

+0

은 맞춤 클래스 인 ParseException입니까? 그렇다면 예제 코드에도이를 추가 할 수 있습니까? –

답변

6

예외가 검사되는지 여부는 전적으로 어떤 종류의 예외인지에 따라 달라집니다. RuntimeException 또는 그 하위 클래스 인 경우 검사되지 않습니다. 그렇지 않으면 그렇습니다. (그리고 네, RuntimeExceptionException   — 자바 라이브러리 설계의 오류 중 하나가 아니라 대부분의 주요의 서브 클래스입니다.)

컴파일러 검사 방법 서명 무엇입니까. 따라서 실제로 던져지는 예외는 (이 목적을 위해) 부적절합니다. 메서드가 throws Exception이라면 메서드에서 Exception을 붙잡거나 메서드 throws Exception을 선언해야합니다. 메소드는 항상 중에서 가장 좁은 값throws을 사용해야합니다.   — 예 : throws Exception이 아니라 throws ParseException입니다.

(내가 말할 "무관 (이 목적을 위해)"물론, 컴파일러가 할 것 다른 것들 중 하나는 당신의 throws 절에 포함되지 않습니다 당신이 체크 된 예외를 포기하지 않는 검사입니다 때문에 .)

편집 당신이 컴파일되지 않습니다 귀하의 편집에 추가 된 코드 : 1. Exception를 던졌습니다 선언하고, 인스턴스없이 2 main 요구를 인스턴스 메소드를 호출합니다.

public class CheckTest 
{ 
    public static final void main(String[] params) 
    { 
     new CheckTest().method2(); 
    } 

    public void method1() throws Exception{ 
     throw new java.text.ParseException("foo", 2); 
    } 

    public void method2() throws Exception{ 
     this.method1(); 
    } 
} 

결과 :

귀하의 경우
CheckTest.java:27: unreported exception java.lang.Exception; must be caught or declared to be thrown 

       new CheckTest().method2(); 
            ^
1 error 
+0

method2는 다루기를 요구하는 반면, main은 아무런 처리없이 왜 괜찮습니까? – froadie

+0

@froadie : 코드가 컴파일되지 않습니다. –

+0

죄송합니다. 나는 실수를 저질렀다. 실제로 main의 헤더에'throws Exception' 절이있었습니다 ... 내가 예상했던 컴파일러 오류를 가져올 때. 죄송합니다, 도와 줘서 고마워! – froadie

3

확인 된 예외가 확인 된 예외가되는 것을 멈추지 않습니다. 확인 된 예외를 체크하지 않은 상태로 바꾸는 방법은 RuntimeException 유형으로 래핑하여 다시 던지는 방법입니다.

2

, 그것은에 Exceptions all the way down을 수 있습니다

이 코드는 다른 문제를 해결하고,이 (제대로) mainthrows Exception 절을 필요로 보여줍니다 호출 스택의 루트.메서드가 Exception을 throw하도록 선언 된 경우 (매우 드물게 수행해야하는 메서드) 호출 메서드는 Exception도 throw하거나 catch하고 처리해야합니다.

편집 편집 된 OP의 예제는 컴파일되지 않습니다. 그래도 처리하지 않으려면 mainException으로 보내도록 선언 할 수 있습니다.

0

컴파일러가 method2()의 문제를 일으키고 그 시점에서 구문 검사를 중지하기 때문에 컴파일러가 main()에서 문제에 대해 불평하지 않을 수도 있습니까? 둘 다 오류가되어야합니다. method2()으로 전화를 수정하여 깨끗한 컴파일을 얻었습니까?

관련 문제