본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/8. 예외 처리

4. Java 자바 [예외 처리] - 예외 떠넘기기 throws

 

 

메소드 내부에서 예외가 발생할 수 있는 코드를 작성 시 try - catch 블록으로 예외를 처리하는 것이

기본이지만, 경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수 있다.

 

throws 키워드 : 메소드 선언부 끝에 작성, 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.

 

형태

 

리턴타입 메소드명(매개변수선언1, . . . ) throws 예외클래스1, 예외클래스2, . . . {

    . . . 

}

 

발생할 수 있는 예외를 종류별로 throws 뒤에 나열하는 것이 일반적이지만,

Exception (상위 예외 클래스) 만으로 모든 예외를 간단히 떠넘길 수 있다.

 

형태

 

리턴타입 메소드명(매개변수선언1, . . . ) throws Exception {

    . . . 

}

 

throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 한다.

그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.

 

throws로 예외 떠넘기기

 

method1() 에서도 try – catch 블록으로 예외 처리하지 않고 throws 키워드로 다시 예외를 떠넘길 수 있다.

 

그러면 method1()을 호출하는 곳에서 결국 try – catch 블록을 사용해서 예외 처리를 해야 한다.

 

public void method1() throws ClassNotFoundException {       // 또 다른 try – catch 블록에서 예외 처리

    method2();

}

 

 

자바 API 도큐먼트에서 클래스 생성자와 메소드 선언부에 throws 키워드가 붙어있는 경우,

이러한 생성자와 메소드를 사용하려면 반드시 try - catch 블록으로 예외 처리를 해야 한다.

 

아니면, throws 를 다시 사용해서 예외를 호출한 곳으로 떠넘겨야 한다.

 

그렇지 않으면 컴파일 에러가 발생한다.

 

예) 자바 API 도큐먼트에서의 Class 의 forName() 메소드

 

forName 선언부

public static Class<?> forName(String className) throws ClassNotFoundException

 

메소드 선언부 맨 뒤에 throws ClassNotFoundException 이 붙어있기 때문에,

forName() 메소드를 호출 시 try - catch 블록으로 예외 처리를 하거나,

throws 로 예외를 떠넘겨야 한다.

 

ex) ThrowsExam.java : 예외 떠넘기기

 

public class ThrowsExam {
    public static void main(String[] args) {
        try {
            findClass();
        } catch(ClassNotFoundException e) {
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
    
    public static void findClass throws ClassNotFoundException {
        Class clazz = Class.forName("java.lang.String2");   // 예외 발생! throws!
    }
}

 

 

main() 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있다.

 

public static void main(String[] args) throws ClassNotFoundException {

    findClass();

}

 

 

JVM 이 최종적으로 예외 처리를 하게 된다.

JVM 은 예외 내용을 콘솔(console)에 출력하는 것으로 예외 처리를 한다.

 

프로그램 사용자는 알 수 없는 예외 내용 출력을 좋아하지 않기 때문에,

main() 메소드에 throws Exception 을 붙이는 것은 좋지 않다.

 

따라서 main() 메소드에서 try - catch 블록으로 예외를 최종 처리하는 것이 바람직하다.