상황에 부합한다면 항상 표준 예외를 재사용 하자. 이 때 API 문서를 참고해 그 예외가 어떤 상황에서 던져 지는 지 꼭 확인해야 한다. 예외의 이름 뿐 아니라 예외가 던져지는 맥락도 부합할 때만 재사용한다
더 많은 정보를 제공하기 원하면 표준 예외를 확장해도 좋다.
단, 예외는 직렬화 할 수 있다는 사실을 기억하자. (직렬화에는 많은 부담이 따르니) 이 사실만으로도 나만의 예외를 새로 만들지 않아야 할 근거로 충분할 수 있다
표준 예외 사용시 장점
- 재사용 증가 → 우리가 작성한 API가 다른 사람이 익히고 사용하기 쉬워진다는 것 (많은 프로그래머에게 이미 익숙해진 규약을 그대로 따르기에)
- 우리 API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽게 된다는 장점도 큼
- 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸림
자주 재사용되는 예외
예외 | 주요 쓰임 |
IllegalArgumentException | 허용하지 않는 값이 인수로 건네졌을 때(null은 따로 NullPointerException 으로 처리) |
IllegalStateException | 객체가 메서드를 수행하기에 적절하지 않은 상태일 때. 예로 제대로 초기화되지 않은 객체를 사용하려 할 때 던질 수 있음 |
NullPointerException | null을 허용하지 않는 메서드에 null을 건넸을 때 |
IndexOutOfBoundException | 인덱스가 범위를 넘어섰을 때 |
ConcurrentModificationException | 허용하지 않는 동시 수정이 발견 됐을 때 |
UnsupportedOperationException | 호출한 메서드를 지원하지 않을 때 |
Exception
,RuntimeException
,Throwable
,Error
는 직접 재사용하지 말자
IllegalArgumentException
과IllegalStateException
사이에 어떤 예외를 사용해야 할 지 헷갈릴 때의 기준- 인수 값이 무엇이었든 어차피 실패했을 거라면
IllegalStateException
- 그렇지 않으면
IllegalArgumentException