forked from Meet-Coder-Study/book-effective-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
53 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# item 72. 표준 예외를 사용하라 | ||
|
||
코드도 재사용하면 이점이 많듯이 예외도 마찬가지이다. Java 표준 라이브러리는 대부분 API에서 쓰기에 충분한 예외를 제공한다. | ||
|
||
## 표준 예외의 장점 | ||
|
||
표준 예외를 사용하면 API가 다른 사람이 익히고 사용하기 쉬워진다. Java 프로그래머라면 Java 표준라이브러리에 나오는 예외들 `ex. NullPointerException, IllegalArgumentException 등` 에 대해서 익숙하기 때문에 어떤 상황이 예외 상황인지를 빠르게 파악할 수 있다. | ||
|
||
예외 클래스의 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 든다. | ||
|
||
### 대표적인 표준 예외 | ||
|
||
- IllegalArgumentException | ||
|
||
허용하지 않은 값이 인수로 전달되었을 때 | ||
|
||
- IllegalStateException | ||
|
||
객체가 메서드를 사용하기에 적절하지 않은 상태일 때 | ||
|
||
- NullPointerException | ||
|
||
null을 허용하지 않는 메서드가 null을 인자로 받을 때 | ||
|
||
- IndexOutOfBoundsException | ||
|
||
인덱스의 범위를 넘어설 때 | ||
|
||
- ConcurrentModificationException | ||
|
||
허용되지 않은 동시 수정이 발견되었을 때 | ||
|
||
- UnsupportedOperationException | ||
|
||
호출한 메서드가 지원하지 않을 때 | ||
|
||
## Exception, RuntimeException, Throwable, Error는 직접 재사용 하지 말 것 | ||
|
||
위 클래스들은 예외 클래스들의 상위 클래스이다. 즉, 구체적인 예외 정보를 알 수 없으므로 안정적으로 테스트할 수 없다. | ||
|
||
## 주의사항 | ||
|
||
- 상황에 부합한다면 항상 표준 예외를 재사용하자. 단, API 문서를 참고하여 사용하고자 하는 Exception이 이름 뿐만아니라 맥락에도 부합하는지 확인해야한다. | ||
|
||
많이 햇갈리는 예외가 바로 `IllegalArgumentException`과 `IllegalStateException`이다. | ||
|
||
카드 덱을 표현하는 객체가 있고 인자로 건넨 수만큼 카드롤 나눠주는 메서드가 있다고 가정한다. 이때 인자로 현재 덱의 카드수보다 높거나 낮은 값을 전달하면 어떤 예외를 던져야할까? | ||
|
||
보통 인수 값이 어떤 값이 되었든 어차피 실패했을 것이라면 `IllegalStateException`, 그렇지 않으면 `IllegalArgumentException`을 선택한다. 따라서 현재 덱의 카드수보다 높은 값이라면 `IllegalStateException`, 낮은 값이라면 `IllegalArguementException`을 던진다. | ||
|
||
- 더 많은 정보를 제공하고자 한다면 표준 예외를 확장해도 된다. 단, 예외는 직렬화할 수 있다는 것을 감안해야한다. | ||
|
||
직렬화에는 많은 부담이 따르므로 이 사실만으로도 커스텀한 예외를 사용해야할 이유가 사라진다. |