자바

JAVA 자바 예외처리 : 예외 떠넘기기

알통몬_ 2017. 3. 13. 11:00
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

예외 떠넘기기

 메서드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 메서드를 호출한 곳으로 되돌릴 수도 있다. 

이 때 사용하는 키워드가 throws 입니다. 

메서드 선언부 끝에 작성되어 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 합니다. 

throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해 주면 됩니다.

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

}

아래와 같이 throws Exception만으로 모든 예외를 떠넘길 수도 있습니다.

리턴타입 메서드염(매개변수,...) throws Exception {

}

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

catch 블록에서 떠넘겨 받은 예외를 처리해야 합니다. 


throws 키워드가 있는 method2()를 method1()에서 호출하는 방법을 보여주는 코드

public void method1() {

    try {

         method2();

    } catch(ClassNotFoundException e) {

       //예외 처리 코드

       System.out.println("클래스가 존재하지 않습니다.");

    }

}


public void method2() throws ClassNotFoundException {

        Class clazz = Class.forName("java.lang.String2");

}


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

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

public void method1() throws ClassNotFoundException {

      method2();

}

자바 API 도큐먼트를 보면 클래스 생서자와 메서드 선언부에 throws 키워드가 붙어있는 것을 흔히 볼 수 있습니다. 

이러한 생성자와 메서드를 사용하고 싶다면, 반드시 try - catch 블록으로 예외처리를 해야합니다. 

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

그렇지 않으면 컴파일 오류가 발생합니다. 

예제) 아래 예제는 Class.forName()메서드를 사용하는 findClass() 메서드는 예외를 떠넘겼고,

 findClass()메서드를 호출하는 main()메서드에서 try - catch 블록을 사용하는 예외처리를 했습니다.

public class ThrowsExample {

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");

}

 

}

main() 메서드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있는데, 

결국 JVM이 최종적으로 예외 처리를 하게 됩니다. 

JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외를 처리합니다.

main() 메서드에서 throws Exception을 붙이는 것은 좋지 못한 예외 처리입니다.  

때문에 main() 메서드에서 try - catch 블록으로 예외를 최종 처리하는 것이 좋습니다.

반응형