규칙 60 - 표준 예외를 사용하라
규칙 61 - 추상화 수준에 맞는 예외를 던져라
규칙 62 - 메서드에서 던져지는 모든 예외에 대해 문서를 남겨라


아래 책를 참고하여 학습한 내용을 정리/기록한 포스트입니다. 자세한 내용은 책을 참고하시기 바라며, 문제가 있을 경우 연락 부탁드립니다.


  • 조슈아 블로크, 이병준(옮긴이), Effective Java, 2판, 인사이트, 2015.



60. 표준 예외를 사용하라

이미 있는 예외들을 재사용하면 좋은 점

  • 배우기 쉽고, 사용하기 편리한 API를 만들 수 있다(관습)
  • 가독성이 높다
  • 예외 클래스 갯수를 줄이면 프로그램의 메모리 요구량이 줄어들고, 클래스를 로딩하는 시간도 줄어든다

널리 재사용되는 예외

재사용 할 수 있는 예외라 생각된다면 사용하도록 하라. 하지만 예외를 발생시키는 조건이 해당 예외의 문서에 기술된 것과 일치해야 한다. 이름만 보고 재사용하면 곤란하며, 의미적으로도 재사용이 가능해야 한다.

Excpetion Example
IllegalArgumentException null이 아닌 인자의 값이 잘못되었을 때
(e.g. 어떤 동작의 실행 횟수를 나타내는 인자에 음수가 전달되었을 때)
IllegalStateException 객체 상태가 메서드 호출을 처리하기에 적절치 않을 때
(e.g. 아직 적절히 초기화되지 않은 객체를 사용하려고 시도할 때)
NullPointerException null 값을 받으면 안 되는 인사에 null이 전달되었을 때
IndexOutOfBoundsException 인자로 주어진 첨자가 허용 범위를 벗어났을 때
ConcurrentModificationException 병렬적 사용이 금지된 객체에 대한 병렬 접근이 탐지되었을 때
UnsupportedOperationException 객체가 해당 메서드를 지원하지 않을 때
(e.g. 객체를 추가하는 것만 가능한 리스트에서 원소를 삭제하려고 할 때)

61. 추상화 수준에 맞는 예외를 던져라

  • 상위 계층에서는 하위 계층에서 발생하는 예외를 반드시 받아서 상위 계층 추상화 수준에 맞는 예외로 바꿔서 던져야 한다. == 예외 변환(exception translation)
  • 가장 좋은 방법은 하위 계층에서 예외가 안생기는 것.
  • 어쩔수 없다면 격리 시킬 것, 나중에 분석에 용이하도록 로그를 남기고 최종 사용자에게는 예외를 감춘다.

62. 메서드에서 던져지는 모든 예외에 대해 문서를 남겨라

  • 점검지정 예외는 독립적으로 선언하고, 해당 예외가 발생하는 상황은 Javadoc @throws 태그를 사용해서 정확하게 밝혀라.
  • 무점검 예외도 @throws 태그를 이용하며 문서를 남겨라. 하지만 메서드 선언부의 throws 뒤에 무점검 예외를 나열하진 마라.
  • 같은 이유로 동일한 예외를 던지는 메서드가 많다면, 메서드마다 문서를 만드는 대신, 해당 예외에 대한 문서는 클래스의 문서화 주석에 남겨도 된다.