아이템 72. 표준 예외를 사용하라. - ksw6169/effective-java GitHub Wiki

표준 예외를 재사용하라.

  • 자바 라이브러리는 대부분의 API에서 쓰기에 충분한 수의 예외를 제공하므로 예외를 재사용하라.

표준 예외를 재사용했을 때의 장점

  • 다른 사람이 익히고 사용하기 쉬워진다.
  • 표준 예외를 적용한 API를 사용하는 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽게 된다.
  • 예외 클래스가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.

표준 예외

IllegalArgumentException

  • 허용하지 않는 값이 인수로 건네졌을 때 사용(null은 NullPointerException으로 처리)
  • ex. 반복 횟수를 지정하는 매개변수에 음수를 건네는 경우

IllegalStateException

  • 대상 객체가 메소드를 수행하기에 적절하지 않을 때 사용
  • ex. 제대로 초기화하지 않은 객체를 사용하려는 경우

NullPointerException

  • null 값을 허용하지 않는 메소드에 null 값을 던질 때 사용

IndexOutOfBoundsException

  • 인덱스가 허용 범위를 넘어섰을 때 사용

ConcurrentModificationException

  • 허용하지 않는 동시 수정이 발견됐을 때 사용
  • ex. 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 사용한다.
  • 동시 수정을 확실히 검출할 수 있는 안정된 방법은 없으므로 이 예외는 문제가 생길 가능성을 알려주는 정도의 역할로 쓰인다.

UnsupportedOperationException

  • 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때 사용
  • ex. 구현하려는 인터페이스의 메소드 일부를 구현할 수 없는 경우

Exception, RuntimeException, Throwable, Error

  • 이 클래스들은 추상 클래스라고 생각하고 직접 재사용하지 말자.
  • 이 예외들은 여러 성격의 예외들을 포괄하는 상위 클래스이므로 안정적으로 테스트할 수 없다.

ArithmeticException, NumberFormatException

  • 복소수나 유리수를 다루는 객체에서 사용

IllegalStateException vs IllegalArgumentException

  • 둘 중 어떤 예외를 사용할지 선택하기가 어려울 때도 있다.
  • 이 경우 일반적인 규칙은 인수 값이 무엇이었든 어차피 실패했을 거라면 IllegalStateException을, 그렇지 않으면 IllegalArgumentException을 던지자.

핵심 정리

  • 상황에 부합한다면 항상 표준 예외를 재사용하자.
  • 이 때 API 문서를 참고해 그 예외가 어떤 상황에서 던져지는지 꼭 확인해야 한다.
  • 예외의 이름뿐 아니라 예외가 던져지는 맥락도 부합할 때만 재사용한다.
  • 더 많은 정보를 제공하길 원한다면 표준 예외를 확장해도 좋다.
  • 단, 예외는 직렬화가 가능하니(직렬화에는 많은 부담이 따른다.) 가급적 예외를 만들지 말고 기존 예외를 재사용하라.

참고 자료

  • Effective Java 3/E