아이템 57. 예외는 예외적 상황에만 사용하라.
57. 예외는 예외적 상황에만 사용하라.
예외 남용시 문제점
- 성능 저하
- 가독성 저하
예외는 이름에서 알수 있듯이, 예외적인 상황에서만 사용해야 한다. 평상시 제어 흐름(ordinary control flow)에 이용해서는 안된다.
만약, hasNext()
메서드가 없었다면,
// 이렇게 하면 곤란
try {
Iterator<Foo> i = collection.iterator();
while(true) {
Foo foo = i.next();
...
}
} catch (NoSuchElementExcepton e) {
}
hasNext
메서드(상태 검사 메서드)가 존재 하지 않았다면,
위와 같이 제어 흐름속에서 예외가 발생하는 상황이 강요 되었을 것이다. 이렇게 구현하면 안된다.
잘 설계된 API는 클라이언트에게 평상시 제어 흐름의 일부로 예외를 사용하도록 강요해서는 안된다.
정상적인 제어 처리 방안
- 상태 검사 메서드 :
Iterator.hasNext()
- 가독성 좋와짐, 그로 인해 디버깅 유리함
- 대부분 상황에서 대응 가능
- 특이값(distinguished value) 제공 :
null, -1
이나 또는enum
상수 제공- 상태 검사 메서드의 반환 값이 가변적이므로, 특이값 제공하는 것이 멀티 쓰레드 환경에서 더 좋음