Item 72 - 표준 예외를 사용하라
코드를 재사용하면 이점이 많듯이 예외도 마찬가지다.
자바 라이브러리는 대부분 API에서 쓰기에 충분한 예외를 제공한다.
표준 예외의 장점 👍
- 표준이기 때문에 다른 개발자가 코드를 보고 예외의 의미를 이해하기 쉬워진다.
- 예외 클래스 수가 적을수록 메모리 사용량과 클래스를 적재하는 시간을 아낄 수 있다.
- 직렬화에도 용이하다.
가장 많이 사용되는 표준 예외 😄
IllegalArgumentException
- 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외
- ex) 반복 횟수를 지정하는 매개변수에 음수값을 건넬 때
- 특수한 경우
- null을 허용하지 않는 메서드에 null을 넘길 경우 NPE
- 어떤 시퀀스의 허용 범위를 넘는 값을 건네면
IndexOutOfBoundsException
IllegalStateException
- 대상 객체가 호출된 메서드를 수행하기에 적절하지 않은 상태일 때 던지는 예외
- ex) 초기화되지 않은 객체를 사용하려 할 때
NullPointerException
null
을 허용하지 않는 메서드에null
을 건넸을 때 발생하는 예외
IndexOutOfBoundsException
- 인덱스의 범위를 넘어섰을 때 발생하는 예외
ConcurrentModificationException
- 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 던지는 예외
- 문제가 생길 가능성을 알려주는 정도의 역할로 쓰인다.
UnsupportedOperationException
- 호출자가 요청한 동작을 대상 객체가 지원하지 않을 때 발생하는 예외
- 보통 구현하려는 인터페이스의 메서드 일부를 구현할 수 없을 때 사용
- ex) add만 가능한 List의 구현 객체에 remove 요청을 할 경우 발생
예외 재사용 시 주의 사항 💣
Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자.
- 그냥 추상 클래스라고 생각하자.
- 여러 성격의 다른 예외들을 포괄하는 상위 클래스이므로 안정적으로 테스트할 수 없다.
예외는 직렬화할 수 있다.
- 예외에서 더 많은 정보를 제공하길 원한다면 표준 예외를 확장해도 좋다.
- 단, 예외는 직렬화할 수 있다는 점을 고려하자.
- 직렬화에는 많은 부담이 따르니 나만의 예외가 꼭 필요한지 생각해보자.
표준 예외중에 어떤 걸 사용해야 할지 헷갈린다면?
IllegalArgumentException VS IllegalStateException
- 표준 예외들의 주요 쓰임이 상호 배타적이지 않기 때문에 선택하기 어려울 수 있다.
- ex) 카드 덱 객체가 있고, 인수로 건넨 수만큼의 카드를 뽑아 나눠주는 메서드가 있다.
- 이때 덱에 남아있는 카드 수보다 큰 값을 건네면 어떤 예외를 던져야할까?
- 인수의 값이 너무 크다는 관점 :
IllegalArgumentException
- 덱에 남은 카드 수가 너무 적다는 관점 :
IllegalStateException
- 인수의 값이 너무 크다는 관점 :
- 일반적인 규칙
IllegalStateExceptpion
: 인수 값이 잘못 들어왔는데, 무엇이었든 어차피 실패했을 경우IllegalArguementException
: 인수 값이 정상으로 들어왔다면 성공했을 경우
This post is licensed under CC BY 4.0 by the author.