본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
선결론
- 표준 예외를 적극적으로 재사용하라
- 자바에는 이미 재사용하기에 좋은 예외들이 충분히 많이 존재한다.
표준 예외 재사용의 장점
- 작성한 API가 다른 사람이 익히고 사용하기에 쉬워진다
- 이 API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 가독성이 향상된다
- 예외 클래스 수가 적을 수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다(이미 JVM이 최적화가 너무 잘되어 있어 예외 클래스 몇개를 더 추가한다고 가시적인 성능저하가 일어나진 않을 것 같은데...)
재사용하기 좋은 예외들
1) IllegalArgumentException
- 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외
2) IllegalStateException
- 대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않을 때 주로 던지는 예외
- 메서드가 던지는 모든 예외를 잘못된 인수나 상태로 퉁칠 수 있지만(IllegalStateException을 던지게끔), 특수한 일부는 따로 구분해서 써야 한다
- null 값을 허용하지 않는 메서드에 null을 던지면 관례상 NullPointerException을 던진다
- 어떤 시퀀스의 허용 범위를 넘는 값을 건넬 때도 indexOutOfBoundsException을 던진다
3) ConcurrentModificationException
- 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 던지는 예외
- 동시 수정을 확실히 검출할 수 있는 확실한 방법은 없으므로 문제가 생길 가능성을 알려주는 정도의 역할로 쓰인다
4) UnsupportedOpertionException
- 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때 던진다
- 보통은 구현하려는 인터페이스의 메서드 일부를 구현할 수 없을 때 쓴다
예시 - Collections.UnmodifiableCollection
static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
... // 생략
public boolean add(E e) {
throw new UnsupportedOperationException();
}
public boolean remove(Object o) {
throw new UnsupportedOperationException();
}
}
총정리
예외 | 주요 쓰임 |
IllegalArgumentException | 허용하지 않는 값이 인수로 건네졌을 떄(null은 따로 NullponterException으로 처리) |
IllegalStateException | 객체가 메서드를 수행하기에 적절하지 않는 상태일 때 |
NullPointerException | null을 허용하지 않는 메서드에 null을 건넸을 때 |
IndexOutOfBoundsException | 인덱스가 범위를 넘어섰을 때 |
ConcourrentModificationException | 허용하지 않는 동시 수정이 발견됐을 때 |
UnsupportedOpertaionException | 호출한 메서드를 지원하지 않을 때 |
기타 TIP
- Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자
- 이 클래스들은 추상 클래스라고 생각하라
- 이 예외들은 다른 예외들의 상위 클래스이므로, 즉 여러 성격의 예외들을 포괄하기 때문에 안정적으로 테스트할 수 없다
- 표준 예외를 재사용할 때는 API 문서를 참고해 예외가 던져지는 맥락을 확인하고, 이에 부합할 때 사용한다
- 더 많은 정보를 제공하길 원한다면 표준 예외를 확장해도 좋다
- 단, 예외는 직렬화할 수 있다는 사실을 기억하자
- 표준 예외의 주요 쓰임이 상호 배타적이지 않으므로 재사용할 예외를 선택하기 어려울 때도 있다
- 각 표준 예외의 용례를 잘 파악하여 적절한 예외를 선택하자
'책 > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 아이템 88: readObject 메서드는 방어적으로 작성하라 (0) | 2022.07.28 |
---|---|
[이펙티브 자바] 아이템 80: 스레드보다는 실행자, 태스크, 스트림을 애용하라 (0) | 2022.07.21 |
[이펙티브 자바] 아이템 71: 필요 없는 검사 예외 사용은 피하라 (0) | 2022.07.16 |
[이펙티브 자바] 아이템 70: 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 (0) | 2022.07.15 |
[이펙티브 자바] 아이템 69: 예외는 진짜 예외 상황에만 사용하라 (0) | 2022.07.15 |