Item 70. Checked Exception & RuntimeException

복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라.

자바는 문제 상황을 알리는 타입으로 검사 예외(checked exception)와 비검사 throwable인 런타임 예외(runtime exception), 에러(error)를 제공한다. 언제 무엇을 사용해야하는지는 완전히 따라야하는 것은 아니지만 어느정도 따라야 하는 지침들이 존재한다.

  • 호출하는 쪽에서 복구할 수 있는 상황: 검사 예외 사용

  • 프로그래밍 오류 발생: 런타임 예외 사용

  • 더 이상 프로그램을 수행할 수 없는 상황: 에러 사용

Checked Exception

검사 예외는 발생하면 그 예외를 catch로 잡아 처리하거나 throws로 던져 호출하는 쪽에서 처리하도록 강제할 수 있다. 검사 예외를 던져 호출하는 쪽에서 처리하도록 강제하는 방법을 선택하면 해당 메서드를 사용하는 쪽에 문제가 발생할 수 있음을 명확하게 알려줄 수 있다.

RuntimeException

프로그래밍 오류를 나타낼 때는 보통 런타임 예외를 사용한다. 런타임 예외는 에러를 잡을 필요가 없거나, 통상적으론 잡지 않는데, 이유는 아래와 같다.

  • 복구가 불가능한 상황일 수 있음

  • 더 실행해봐야 의미가 없거나 득보다는 실이 많을 수 있음

때문에 보통은 런타임 예외를 잡지 않고, 해당 스레드는 적절한 오류 메시지를 내뱉으며 중단되도록 하는 것이 일반적이다. 만약 복구할 수 있다고 판단된다면 검사 예외를 사용하는 것이 좋지만, 확신하기 어려운 경우엔 런타임 예외를 사용하는 것이 좋다.

Error

에러는 보통 JVM에서 발생하는 문제를 나타내는데, Error 클래스를 상속하여 사용하거나 직접 던지는 것은 좋지 않다.(AssertionError는 예외) 때문에 직접 구현하는 비검사 throwable은 모두 RuntimeException의 하위 클래스가 되어야 한다.

Throwable

Throwable은 검사 예외, 런타임 예외, 에러의 최상위 클래스인데, 이 클래스를 직접 사용할 일은 없으니, 사용하지 않도록 하자.

Last updated

Was this helpful?