본문으로 바로가기

[Java] 자바 예외 넘기기 (throws)

category Backend/Java 2021. 12. 27. 12:10

1. 예외 넘기기

  • 메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만 메소드를 호출한 곳으로 예외를 떠넘길 수도 있습니다.
  • 예외가 난 곳에서 즉시 처리하지 않고 다른 메소드에서 처리하는 방식입니다.
  • throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 합니다.
  • throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 하고 catch 블록에서 떠넘겨 받은 예외를 처리해야 합니다.

[형식]

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

}

2. 예시

예외가 발생 가능성이 있는 메소드에서 예외처리

  • Exception(NullPointerException) 예외를 활용해 예시를 작성하였습니다.
  • upperCase 메소드는 문자열을 받아 대문자로 만들어 return 하는 함수로 해당 함수에서 자체적으로 예외처리를 했습니다. 
public static void main(String[] args) {
    System.out.println(upperCase(null));
}

private static String upperCase(String str) {

    String returnStr = null;

    try {
        returnStr = str.toUpperCase();
    } catch (Exception e) {
        returnStr = "Exception";
    }

    return returnStr;
}

 

throws로 예외 떠넘겨서 예외처리

  • throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 하고 catch 블록에서 떠넘겨 받은 예외를 처리해야 합니다.
public static void main(String[] args) {
    try {
        System.out.println(upperCase(null));
    } catch (Exception e) {
        System.out.println("Exception");
    }
}

private static String upperCase(String str) throws Exception {
    return str.toUpperCase();
}

예외 떠넘기기

3. main() 

  • 다음과 예시와 같이 upperCase 메소드에서 던진 예외를 main 메소드에서 처리하지 않고 똑같이 throws 키워드를 이용해 예외를 떠넘길 수 있습니다.
  • main 메소드가 떠넘기게 예외를 떠넘기게 되면 결국 JVM이 예외 처리를 하여 예외 내용을 Console에 출력하는 것으로 예외를 처리합니다.
  • main() 메소드에서 throws Exception을 붙이는 것은 좋지 못한 예외 처리 방법입니다. 프로그램이 알 수 없는 예외 내용을 출력하고 종료되는 것은 좋지 않을뿐더러 문제가 있는 것을 처리하지 않을 경우 더 큰 문제를 야기할 수도 있습니다.
  • main()에서 try-catch 블록으로 예외를 최종 처리하는 것이 바람직합니다.
public static void main(String[] args) throws Exception {
    System.out.println(upperCase(null));
}

private static String upperCase(String str) throws Exception {
    return str.toUpperCase();
}