item 69) 예외는 진짜 예외 상황에만 사용하라
예외는 예외 상황에서만 사용하기
예외는 오직 예외 상황에서만 사용하고, 일상적인 제어 흐름용으로 사용되어선 안된다.
JVM에서 로직 수행 전에 먼저 추론하여 예외를 발생시키는 것을 성능 개선용으로 catch하여 예외를 없애버린다면, 실제 예외가 발생하는 경우 잡을 수 없다.
만약 성능이 좋아지더라도, 최적화로 얻은 상대적인 성능 개선은 자바 플랫폼이 개선된다면 무용지물될 수도 있다.
잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다.
다음은 예외를 사용해 배열의 끝에 도달하면 종료하는 코드이다. for-each문으로 간단하게 사용할 수 있는 것을 잘못된 추론을 통해 최적화해보려 한 것이다.
코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한되는 단점도 있다.
상태 검사 vs 옵셔널/null 반환
특정 상태에서만 호출할 수 있는 상태 의존적 메서드라면 1) '상태 검사' 메서드를 같이 제공하거나, 2) 올바르지 않은 상태일 때 빈 옵셔널이나 null 등을 반환해야 한다.
Iterator 인터페이스의
next
는 상태 의존적 메서드이고,hasNext
는 상태 검사 메서드이다.
선택 기준
외부 동기화 없이 여러 스레드가 접근하거나 외부 요인으로 상태가 바뀔 수 있다면, 옵셔널이나 특정 값을 사용한다.
성능이 중요한데 상태 검사 메서드가 상태 의존적 메서드의 작업 일부를 중복 수행한다면, 옵셔널이나 특정 값을 사용한다.
이외의 경우에는 가독성이 좋고, 잘못 사용했을 때 발견하기 쉬운 상태 검사 메서드 방식이 조금 더 낫다.
Last updated