item 69) 예외는 진짜 예외 상황에만 사용하라

예외는 예외 상황에서만 사용하기

  • 예외는 오직 예외 상황에서만 사용하고, 일상적인 제어 흐름용으로 사용되어선 안된다.

  • JVM에서 로직 수행 전에 먼저 추론하여 예외를 발생시키는 것을 성능 개선용으로 catch하여 예외를 없애버린다면, 실제 예외가 발생하는 경우 잡을 수 없다.

  • 만약 성능이 좋아지더라도, 최적화로 얻은 상대적인 성능 개선은 자바 플랫폼이 개선된다면 무용지물될 수도 있다.

  • 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다.

  • 다음은 예외를 사용해 배열의 끝에 도달하면 종료하는 코드이다. for-each문으로 간단하게 사용할 수 있는 것을 잘못된 추론을 통해 최적화해보려 한 것이다.

try {
    int i = 0;
    while (true)
        range[i++].climb();
} catch (ArrayIndexOutOfBoundsException e) {
}
  • 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한되는 단점도 있다.

상태 검사 vs 옵셔널/null 반환

  • 특정 상태에서만 호출할 수 있는 상태 의존적 메서드라면 1) '상태 검사' 메서드를 같이 제공하거나, 2) 올바르지 않은 상태일 때 빈 옵셔널이나 null 등을 반환해야 한다.

  • Iterator 인터페이스의 next는 상태 의존적 메서드이고, hasNext는 상태 검사 메서드이다.

선택 기준

  • 외부 동기화 없이 여러 스레드가 접근하거나 외부 요인으로 상태가 바뀔 수 있다면, 옵셔널이나 특정 값을 사용한다.

  • 성능이 중요한데 상태 검사 메서드가 상태 의존적 메서드의 작업 일부를 중복 수행한다면, 옵셔널이나 특정 값을 사용한다.

  • 이외의 경우에는 가독성이 좋고, 잘못 사용했을 때 발견하기 쉬운 상태 검사 메서드 방식이 조금 더 낫다.

Last updated