표준 예외의 장점
- 개발자가 작성한 API를 다른 사람이 익히고 사용하기 쉬워진다.
- 가독성이 향상되어 프로그램이 읽기 쉬워진다.
- 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.
많이 사용하는 예외 종류
IllegalArgumentException(item 49)
: 허용하지 않는 값이 인수로 건네졌을 때
- ex. 반복 횟수를 지정하는 매개변수에 음수를 건넬 때
- 특수한 경우
- null 값을 허용하지 않는 메소드에 null을 건네면 NPE
- 어떤 시퀀스의 허용 범위를 넘는 값을 건네면 IndexOutOfBoundsException
IllegalStateException
: 객체가 메소드를 수행하기에 적절하지 않은 상태일 때
- ex. 제대로 초기화되지 않은 객체를 사용하려 할 때
NullPointerException
: null을 허용하지 않는 메소드에 null을 건넸을 때
IndexOutOfBoundsException
: 인덱스가 범위를 넘어섰을 때
ConcurrentModificationException
: 허용하지 않는 동시 수정이 발견됐을 때
- 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때
- 동시 수정을 확실히 검출할 수는 없으므로, 문제가 생길 가능성을 알려주는 정도의 역할로 쓰인다.
UnsupportedOperationException
: 호출한 메소드를 지원하지 않을 때
- 객체가 지원하지 않는 연산을 시도할 때
- 특정 인터페이스를 부분적으로만 구현하는 클래스에서 유용하게 사용된다.
- ex. 특정 List 구현체가 원소를 추가하는 것만 지원하고 원소를 제거하는 기능을 지원하지 않는다면, remove() 메소드에 대한 호출에서 사용 가능
IllegalArgumentException vs IllegalStateException
애매한 경우, 선택 기준
- 예: 카드 덱 객체가 있고, 그 객체의 메소드를 통해 카드를 뽑을 때, 덱에 남아있는 카드 수보다 큰 값을 인수로 전달하는 상황
- 인수의 값이 너무 크다는 관점: IllegalArgumentException
- 덱에 남은 카드 수가 너무 적다는 관점: IllegalStateException
- IllegalStateException(인수 값이 잘못 들어왔는데, 무엇이었든 어차피 실패했을 경우)
- 인수로 무슨 값을 전달하든 덱의 상태 자체가 작업을 수행하기에 적절하지 않을 경우 사용한다.
- ex. 덱이 어떤 연산을 수행 중이라면 어떤 값을 전달하더라도 그 시점에는 카드를 뽑을 수 없다.
- IllegalArgumentException(그렇지 않은 경우)
- ex. 예를 들어, 덱에 10장의 카드가 남아있는데 15장의 요청할 경우
Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자.
- 다른 예외들의 상위 클래스이므로, 여러 성격의 예외들을 포괄하는 클래스이므로 안정적으로 테스트할 수 없다.
표준 예외 확장
- 표준 예외만으로는 충분한 정보를 제공하지 못할 때가 있다.
- 이때, 사용자 정의 예외를 생성하여 필요한 정보나 기능을 추가할 수 있다.
- 그러나 직렬화의 부담과 복잡성이 커지게 된다.(item 12)
- 모든 예외는 Serializable 인터페이스를 구현하기 때문에 직렬화의 대상이 된다.
- 따라서 사용자 정의 예외를 만들 때, 예외에 포함된 필드나 관련된 클래스가 모두 직렬화 가능한지, 직렬화 과정에서 발생할 수 있는 문제들을 고려해야 한다.
'Language > Java' 카테고리의 다른 글
[effective java] 아이템 74. 메서드가 던지는 모든 예외를 문서화하라. (0) | 2023.08.12 |
---|---|
[effective java] 아이템 73. 추상화 수준에 맞는 예외를 던지라. (0) | 2023.08.12 |
[effective java] 아이템 71. 필요 없는 검사 예외 사용은 피하라. (0) | 2023.07.31 |
[effective java] 아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라. (0) | 2023.07.31 |
[effective java] 아이템 69. 예외는 진짜 예외 상황에만 사용하라. (0) | 2023.07.31 |