예외 떠넘기기 - throws 사용
메서드 내부에서 예외가 발생했을 때 예외를 try - catch 문으로 잡아서 처리할 수 있지만 경우에 따라서 현재 메서드를 호출한 메서드로 예외를 떠넘길 수 있습니다.

예외를 떠넘기는 방법은 다음과 같이 throws 키워드를 메서드 뒤에 붙여주면 됩니다.
public static void generateException() throws NullPointerException{
    //NullPointerException 발생
}

만약 떠넘겨야할 예외 종류가 여러개라면 쉼표(,) 를 기준으로 나열하여 선언합니다. 

public static void generateException() throws NullPointerException, ArithmeticException{
    //예외 발생
}


예외가 발생하는 경우 try - catch문을 통해 처리하지 않고 throws를 이용해 떠넘기면 현재 메서드를 호출한 곳으로 던져지게 됩니다.
만약 모든 메서드에서 throws 를 이용해 예외를 떠넘기다 보면 최초 호출 지점인 main() 메서드 내부로 예외가 던져지게 되며 main() 메서드에서 마저 예외를 떠넘기게 된다면 JVM의 예외처리기까지 도달하여 프로그램은 그대로 종료됩니다.

이렇게 되면 사실상 예외를 처리하지 않은것이나 다름 없으므로 매우 무의미한 행동이라 할 수 있겠습니다. 의도적인 경우가 아니라면 throws는 많은 생각과 필요에 의해 사용되어야 합니다.


예외를 떠넘기는 이유
예외가 발생한 경우 굳이 메서드 내에서 try-catch 문으로 예외를 처리하지 않고 throws문으로 떠넘기는 이유는 무엇일까요?

첫번째 이유는 메서드 선언부에 선언된 throws문을 통해 해당 API를 사용했을 때 어떤 예외가 발생할 수 있는지를 예측할 수 있습니다.

다음은 java api 공식 문서입니다. 선언부를 보면 IOException이 던져진다는 것을 알 수 있습니다.



두번째 이유로는 현재 메서드 내에서 예외를 처리할 필요가 없다고 판단했을 경우입니다. 예외 처리에는 생각보다 많은 코드가 필요하게 되며 이는 코드를 읽기 어렵게 만들고 불필요한 코드가 많이 추가되게 만들어 버그를 만들기 쉽습니다. 또한 API를 만드는데에 있어서 내가 처리하기 보다는 내가 만든 API를 사용하는 다른 개발자에게 원하는 처리를 하도록 기회를 줄 수 있습니다.


예를 들어 다음과 같이 내가 methodB() 라는 메서드를 개발중에 있고 현재 이 메서드에서는 NullPointerException이 발생할 수 있다는것을 인지했습니다.
이때 내가 직접 나중을 대비해 try-catch문을 사용하여 내가 원하는대로 처리해줄 수 있지만 내가 만든 코드를 사용하는 다른팀원들이 해당 예외가 발생했을때의 처리를 각각 원하는대로 구현하도록 기회를 줌과 동시에 메서드 선언부를 통해 NullPointerException가 발생할 수 있다는 것을 알려주는 것입니다.

이 밖에도 팀의 정책이나 api 설계 규칙, 플랫폼 환경에 따라(웹 서버 환경이라든지) throws를 사용하는 이유는 많습니다. 가장 중요한 점은 단순히 예외 처리하기 귀찮아서 사용하는 것은 절대금지 라는 사실입니다.


참고글

[JAVA] 자바 예외를 발생시키는 방법 - throw

[JAVA] 사용자 정의 예외



블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!