자바 라이브러리는 대부분 API에서 쓰기에 충분한 수의 예외를 제공한다.
표준 예외를 재사용하면 얻는 게 많다.
- 많은 프로그래머에게 이미 익숙해진 규약을 따르기 때문에 내가 만든 API를 다른 사람이 익히고 사용하기 쉬워진다.
- 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.
표준 예외
IllegalArgumentException
- 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외
- ex) 반복 횟수를 지정하는 매개변수에 음수를 건넬 때
IllegalStateException
- 대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않을 때 던지는 예외
- ex) 제대로 초기화되지 않은 객체를 사용하려 할 때
NullPointerException
- null 값을 허용하지 않는 메서드에 null을 건넬 때
IndexOutOfBoundsException
- 어떤 시퀀스의 허용 범위를 넘는 값을 건넬 때
ConcurrentModificationException
- 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때
- 문제가 생길 가능성을 알려주는 정도의 역할로 쓰인다.
UnsupportedOperationException
- 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때
- 대부분 객체는 자신이 정의한 메서드를 모두 지원하니 흔히 쓰이지는 않는다.
- 보통 구현하려는 인터페이스의 메서드 일부를 구현할 수 없을 때 사용
- ex) 원소를 넣을 수만 있는 List 구현체에 대고 누군가 remove 메서드를 호출할 때
주의할 점
Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자.
- 이 클래스들은 추상 클래스라고 생각하자.
- 이 예외들은 여러 성격의 다른 예외들을 포괄하는 상위 클래스이므로 안정적으로 테스트할 수 없다.
예외의 쓰임이 상호 배타적이지 않기에 종종 재사용할 예외를 선택하기 어려울 때가 있다.
카드 덱을 표현하는 객체가 있고, 인수로 건넨 수만큼의 카드를 뽑아 나눠주는 메서드가 있다.
덱에 남아 있는 카드 수보다 큰 값을 건네면 어떤 예외를 던져야 할까?
- 인수의 값이 너무 크다고 본다면 IllegalArgumentException을 던질 것이고,
- 덱에 남은 카드 수가 너무 적다고 본다면 IllegalStateException을 던진다.
일반적인 규칙
- 인수 값이 무엇이었든 어차피 실패했을 거라면 IllegalStateException을 던지고,
- 그렇지 않으면 IllegalArgumentException을 던지자
결론
- 표준 예외를 재사용하면 얻는 것이 많으니 상황에 부합한다면 항상 재사용하자.
- 이때 API 문서를 참고해 그 예외가 어떤 상황에서 던져지는지 확인해야 한다.
- 예외의 이름뿐 아니라 예외가 던져지는 맥락도 부합할 때만 재사용한다.
- 더 많은 정보를 원한다면 표준 예외를 확장해도 좋다.
- 예외는 직렬화할 수 있으므로 나만의 예외를 새로 만들기에는 많은 부담이 따른다.
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 74. 메서드가 던지는 모든 예외를 문서화하라 (0) | 2023.08.11 |
---|---|
[Effective Java] Item 73. 추상화 수준에 맞는 예외를 던지라 (0) | 2023.08.11 |
[Effective Java] Item 71. 필요 없는 검사 예외 사용은 피하라 (0) | 2023.08.06 |
[Effective Java] Item 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 (0) | 2023.08.05 |
[Effective Java] Item 69. 예외는 진짜 예외 상황에만 사용하라 (0) | 2023.08.05 |