Skip to content

Commit

Permalink
[Meet-Coder-Study#72] 표준 예외를 사용하라
Browse files Browse the repository at this point in the history
  • Loading branch information
pkch93 committed Mar 23, 2021
1 parent acf739d commit 3355514
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions 10장/72_표준_예외를_사용하라_박경철.md
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`을 던진다.

- 더 많은 정보를 제공하고자 한다면 표준 예외를 확장해도 된다. 단, 예외는 직렬화할 수 있다는 것을 감안해야한다.

직렬화에는 많은 부담이 따르므로 이 사실만으로도 커스텀한 예외를 사용해야할 이유가 사라진다.

0 comments on commit 3355514

Please sign in to comment.