Item 57. 예외는 예외적 상황에만 사용하라.

예외 남용시 문제점

예외는 이름에서 알수 있듯이, 예외적인 상황에서만 사용해야 한다. 평상시 제어 흐름(ordinary control flow)에 이용해서는 안된다.

만약, hasNext()함수가 없었다면,

// 이렇게 하면 곤란
try {
    Iterator<Foo> i = collection.iterator();
    while(true) {
        Foo foo = i.next();
        ...
    }
} catch (NoSuchElementExcepton e) {
}

hasNext함수(상태 검사 함수)가 존재 하지 않았다면, 위와 같이 제어 흐름속에서 예외가 발생하는 상황이 강요 되었을 것이다. 이렇게 구현하면 안된다.

잘 설계된 API는 클라이언트에게 평상시 제어 흐름의 일부로 예외를 사용하도록 강요해서는 안된다.

정상적인 제어 처리 방안

  1. 상태 검사 함수 : Iterator.hasNext()
    • 가독성 좋와짐, 그로 인해 디버깅 유리함
    • 대부분 상황에서 대응 가능
  2. 특이값(distinguished value) 제공 : null, -1이나 또는 enum상수 제공
    • 상태 검사 함수의 반환 값이 가변적이므로, 특이값 제공하는 것이 멀티 쓰레드 환경에서 더 좋음