item69
// 예외를 완전히 잘못 사용한 예
try {
int i = 0;
while(true) {
range[i++].climb();
}
} catch (ArrayIndexOutOfBoundsException e) {
}
위 코드는 무한루프를 돌다가 배열의 끝에 도달해 Exception이 발생하면 끝을 낸다. 이 코드는 아래의 코드와 같다.
for (Mountain m : range)
m.climb();
예외를 사용하여 구현한 이유는 성능을 올리기 위함이라던가 하는 이유가 있을 수 있겠지만 이렇게 예외를 사용하면 안된다. 예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다.
(위 코드는 성능이 오히려 좋지 않다.)
예외 사용 원칙은 API 설계에도 적용된다. 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다. 특정 상태에서만 호출할 수 있는 ‘상태 의존적’ 메서드를 제공하는 클래스는 ‘상태 검사’ 메서드도 함께 제공해야 한다. 그 예시로 Iterator 인터페이스의 next와 hasNext가 각각 상태 의존적 메서드와 상태 검사 메서드에 해당한다.
for(Iterator<Foo> i = collection.iterator(); i.hasNext();) {
Foo foo = i.next();
...
}
상태 검사 메서드, 옵셔널, 특정 값 중 하나를 선택하는 지침 몇개를 알아보자