Java/자바 정리

98. 예외를 던진다? throws로 책임을 미루는 방법

코딩하는냥이 2025. 5. 13. 12:07
반응형

이번 글에서는 예외를 직접 처리하지 않고 호출한 곳으로 전달하는 방법인 throws 키워드를 배워봅니다.
또한 main() 메서드에 throws Exception을 붙이면 어떤 효과가 있는지도 함께 살펴봅니다.


📌 예제 코드

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            findClass("java.lang.String2"); // 존재하지 않는 클래스명
        } catch (Exception e) {
            System.out.println("예외 처리 : " + e.toString());
        }
    }

    // ClassNotFoundException 예외를 직접 처리하지 않고 호출한 곳으로 던짐
    public static void findClass(String str) throws ClassNotFoundException {
        Class.forName(str);
    }
}

💻 실행 결과

예외 처리 : java.lang.ClassNotFoundException: java.lang.String2

💬 코드 설명

  • findClass() 메서드에서 Class.forName()을 호출하며, 이 과정에서 클래스를 찾을 수 없는 경우 ClassNotFoundException이 발생합니다.
  • 해당 예외는 메서드 내부에서 try-catch로 처리하지 않고, throws ClassNotFoundException을 통해 호출한 쪽으로 예외를 넘깁니다.
  • main() 메서드에서는 try-catch를 사용해 예외를 받아 처리하고, 예외 정보를 출력합니다.

⚠️ main()에 throws Exception을 붙이면?

public static void main(String[] args) throws Exception {
    findClass("java.lang.String2");
}

이렇게 작성하면 main()에서도 예외를 처리하지 않고 JVM에게 직접 예외를 넘깁니다.
결과적으로 예외 메시지는 콘솔에 그대로 출력되지만, 명시적인 예외 처리 없이 프로그램이 종료됩니다.

실행 결과 예시:

Exception in thread "main" java.lang.ClassNotFoundException: java.lang.String2
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:315)
	at ch11.sec03.exam01.ThrowsExample.findClass(ThrowsExample.java:13)
	at ch11.sec03.exam01.ThrowsExample.main(ThrowsExample.java:6)

✔️ 즉, throws Exception을 main()에 붙이면 예외가 발생했을 때 프로그램이 중단되며 개발자용 오류 메시지가 그대로 출력됩니다.
이는 테스트나 간단한 실습에서는 편리하지만, 실제 서비스 코드에서는 사용자 친화적인 처리를 위해 try-catch로 감싸는 것이 일반적입니다.


💡 포인트 정리

  • throws는 예외 처리를 자신이 하지 않고 호출한 쪽에 떠넘기는 키워드입니다.
  • 예외를 위임하면 호출한 메서드에서 반드시 예외를 처리하거나, 다시 throws로 넘겨야 합니다.
  • main()에 throws Exception을 붙이면 예외 발생 시 JVM이 예외를 콘솔에 출력하고 프로그램을 종료합니다.
  • 사용자에게 친절한 메시지를 제공하고 싶다면 try-catch를 활용해 예외를 직접 처리해야 합니다.

📌 정리하자면, throws는 예외를 직접 처리하지 않고 다음 호출 지점으로 넘기는 방법입니다.
예외가 전달된 메서드에서는 try-catch로 받아서 처리하거나, 다시 throws로 넘겨야 하며,
main()에서 처리하지 않으면 JVM이 예외 메시지를 출력하고 프로그램이 종료됩니다.