2017-12-18 18 views
1

다음 코드가 제대로 컴파일되지만 호출되는 메서드가 Exception을 내포하지 않아도되는 이유는 무엇입니까? Exception이 검사 예외이며 확인되지 않은 예외가 아닌가? 명확히하십시오. 내가 IOexception와 시도 캐치 (체크 예외를) 사용하려면예외가 잡히지는 않지만 IOException은 발생합니다

class App { 
    public static void main(String[] args) { 
     try { 
      amethod(); 
      System.out.println("try "); 
     } catch (Exception e) { 
      System.out.print("catch "); 
     } finally { 
      System.out.print("finally "); 
     } 
     System.out.print("out "); 
    } 
    public static void amethod() { } 
} 

, 방법은 IOException을 던질 필요를 호출되고. 나는 이걸 얻는다.

import java.io.IOException; 

class App { 
    public static void main(String[] args) { 
     try { 
      amethod(); 
      System.out.println("try "); 
     } catch (IOException e) { 
      System.out.print("catch "); 
     } finally { 
      System.out.print("finally "); 
     } 
     System.out.print("out "); 
    } 
    public static void amethod() throws IOException { } 
} 
+2

귀하의 이해가 거꾸로 생각됩니다. 'throws' 선언은 호출자가 걸러 낼 예외가 아니라 호출 수신자가 던져 낼 체크 된 예외를 나열하기위한 것입니다. –

답변

1

은 '예외'체크 예외 아닌 체크되지 않는 예외 아닌가?

예, 그렇습니다.

비록 우리가 그 방법이 Exception을 던지지 않는다고하더라도, catch(Exception e){ 코드는 여전히 실행될 수 있습니다. try 블록의 코드는 여전히 Exception에서 상속되는 내용을 던질 수 있습니다. 여기에는 RuntimeException 및 해당 하위 클래스가 포함되며이 하위 클래스는 선택되지 않습니다.

catch(IOException e){ 다른 한편으로는 확인 된 예외 만 catch 할 수 있습니다. (Java는 다중 상속을 허용하지 않으므로 IOException의 하위 클래스는 모두 RuntimeException의 하위 클래스가 될 수 없습니다. 컴파일러는 try 블록의 코드 중 어느 것도 IOException을 던질 수 없음을 쉽게 알 수 있습니다. 확인 된 예외를 던지는 모든 메소드는 코드에 플래그를 지정할 수 있도록 명시 적으로 so를 말해야합니다.

+0

완벽! 이해하기 쉬운 –

1

자바 언어 사양이이 상황에서 특별히 Exception을 처리한다는 사실로부터 관찰되는 동작입니다. §11.2.3에 따르면 캐치 절 확인 예외 클래스 E 을 잡을 수는 try 블록이 catch 조항에 해당하는 경우가 아니라면

그것은 컴파일 타임 오류가 발생하는 것은 던질 수 E 이 Exception이거나 Exception의 수퍼 클래스가 아닌 경우 E 1 서브 클래스 또는 수퍼 클래스 인 확인 된 예외 클래스입니다. Exception (그리고 수퍼 클래스가 Throwable)도 RuntimeException을 확장 예외를 포착하는 데 사용될 수 있기 때문에

이 합리적이다. 런타임 예외가 항상 가능하기 때문에 컴파일러는 확인 된 예외가 있는지 여부에 관계없이 항상 Exceptioncatch 절에 표시 할 수 있습니다.