2011-04-29 1 views
2
public class simple { 
    public static void main(String[] args) { 
     try { 
      System.out.print("hello "); 
      throwit(); 
     } catch (Exception re) { 
      System.out.print("caught "); 
     } 
    } 

    public static void throwit(){ // line number 11 
     throw new Exception(); // line number 12 
    } 
    } 

줄 번호 12에 컴파일 오류가 표시됩니다. 줄 번호 11에 대해 예외를 throw하는 경우 제대로 작동합니다. 예외의 하위 클래스를 던지면 (12 번 줄에서) 제대로 작동합니다 ... 이유는 무엇입니까? ...왜 try catch 문에서 호출 된 메서드에서 Exception (checked)을 throw 할 수 없습니까?

사실 나는 뒤쪽에서 어떤 일이 발생 하는지를 알고 싶습니다.

+0

해야한다,에 관계없이하여 throwit 어떤 코드를 호출의 그 선언 할 필요가있다. – MatrixFrog

답변

10

확인 된 예외를 throw하는 메서드가 있지만 해당 메서드의 서명이이를 수행 할 수 있다고 지정하지 않습니다. 확인 된 모든 예외는 메서드 시그니처에 선언되어야하며 try/catch 블록이나 재실행에 의해 명시 적으로 처리되어야합니다. 이것이 검사 된 예외의 정의입니다. :)

이 줄은 :하여 throwit는 체크 예외가 발생하는 경우

public static void throwit() 

public static void throwit() throws Exception 
+6

우리는'Exception'을 던지고'Exception'을 던지는 것으로 메소드를 선언하는 것이 거의 확실한 나쁜 아이디어라는 것에 주목해야합니다. 호출자가 의미있는 작업을 수행하는 것을 매우 어렵게 만듭니다 ... 로그 예외와 구제를 제외하고. 호출자가 예기치 않은 예외와 예상 된 것을 구별 할 수 있도록보다 구체적인 예외를 던지거나 선언해야합니다. –

+0

정확히 ... 특정 예외 (예 : "NullPointerException")를 throw하면 컴파일러에서 오류가 발생하지 않습니다 ("throws Exception"은 메서드 서명에도 필요하지 않습니다). 이 코드는 단지 예외 처리의 개념을지지합니다 ... 왜 예외를 던지지 않을 수 있습니까? ... 컴파일러가 어떻게 작동하는지 알고 싶습니까? .. –

+0

'unchecked' 예외를 throw하면 컴파일러에서 검사를하지 않아 오류가 발생했습니다. RuntimeException 및 Error의 모든 하위 클래스는 나머지가 선택되어 있는지 확인되지 않습니다. –

관련 문제