예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여서는 안 된다. 예를 들어, 반복문에 예외를 사용하는 것은 직관적이지도 않을 뿐더러 성능도 더 느리다.
표준적이고 쉽게 이해되는 관용구를 사용하고, 성능 개선을 목적으로 과하게 머리를 쓴 기법은 자제하자. 실제로 성능이 좋아지더라도 자바 플랫폼이 꾸준히 개선되고 있는 최적화로 얻은 상대적인 성능 우위가 오래가지 않을 수 있다. 반면 과하게 영리한 기법에 숨겨진 미묘한 버그의 폐해와 어려워진 유지보수 문제는 계속 이어질 것이다.
이 원칙은 API 설계에도 적용된다. 잘 설계된 API라면 클라이언트가 정삭적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다. 특정 상태에세만 호출할 수 있는 '상태 의존적' 메서드를 제공하는 클래스는 '상태 검사' 메서드도 함께 제공해야 한다. (ex. Iterator 인터페이스의 next, hasNext 메서드)
상태 검사 메서드 대신 사용할 수 있는 선택지도 있다. 올바르지 않은 상태일 때 빈 옵셔널 혹은 null 같은 특수한 값을 반환하는 방법이다. 상태 검사 메서드
, 옵셔널
, 특정 값
중 하나를 선택하는 지침은 다음과 같다.
📌 핵심 정리
예외는 예외 상황에서 쓸 의도로 설계되었다. 정상적인 제어 흐름에서는 사용하면 안 되며, 이를 프로그래머에게 강요하는 API를 만들어서도 안 된다.