아이템 57. 예외는 예외적 상황에만 사용하라.

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상수 제공
    • 상태 검사 메서드의 반환 값이 가변적이므로, 특이값 제공하는 것이 멀티 쓰레드 환경에서 더 좋음