Java ‐ 예외는 진짜 예외 상황에만 사용하라[Effective Java Item 69] - woojin-playground/Backend-PlayGround GitHub Wiki
예외는 진짜 예외 상황에만 사용하라
- 다음은 예외를 잘못 사용한 경우에 해당한다.
// Bad
try {
int i = 0;
while(true)
range[i++].climb();
} catch (ArrayIndexOutOfBoundsException e) {
}
- JVM은 배열에 접근할 때, 인덱스를 초과하는지 확인하는데, 반복문도 이와 같은 동작을 수행한다.
- 따라서 중복을 없애기 위해 예외를 사용한 것이다.
- 하지만 이는 다음과 같은 3가지 이유로 잘못된 추론에 해당한다.
1. 예외는 예외 상황에서 쓰이기 위해 만들어진 것인데 JVM 설계자가 성능적 측면을 고려하지 않았다. 2. try~catch 블럭 안에서는 JVM이 수행하는 최적화가 제한된다. 3. 앞서 본 예제에서의 중복 검사는 실제로 중복으로 수행되지 않는다. JVM이 최적화를 통해 없애기 때문이다.
API 설계 시의 예외
- 잘 설계된 API는 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다.
- 특히 특정 상태에서만 호출할 수 있는 메서드는 상태 검사 메서드를 함께 제공해야 한다. 예를 들면 Iterator 인터페이스가 있다.
// Good
// next() : 특정 상태에서만 호출할 수 있는 메서드
// hasNext() : 상태 검사 메서드
next()
hasNext()
- Iterator API는
hasNext()를 함께 제공함으로써, 클라이언트가 직접 예외를 사용하지 않아도 되게끔 설계되어 있다. - 이런 상태 검사 메서드는 직접 제공하지 않는 경우에는 Optional 혹은 null과 같은 특수한 값을 반환하도록 해야 한다.