-
Notifications
You must be signed in to change notification settings - Fork 92
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[#72][A팀] 표준 예외를 사용하라
- Loading branch information
Showing
1 changed file
with
162 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,162 @@ | ||
**ITEM 72** | ||
|
||
# 표준 예외를 사용하라. | ||
|
||
|
||
|
||
자바 라이브러리는 대부분 API 에서 쓰기에 충분한 수의 예외를 제공한다. | ||
|
||
표준 예외를 재사용하면 얻는 게 많다. | ||
|
||
1. API가 다른 사람이 익히고 사용하기 쉬워진다는 것 | ||
2. API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽게 된다는 장점 | ||
3. 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. | ||
|
||
|
||
|
||
## 자주 재사용하는 예외 | ||
|
||
|
||
|
||
- #### IllegalArgumentException | ||
|
||
호출자가 인수로 부적절한 값을 넘길 때 던지는 예외 | ||
|
||
|
||
|
||
예시 | ||
|
||
```java | ||
public class MainRunner { | ||
|
||
List<Integer> list = new ArrayList<>(); | ||
|
||
public void positiveAdd(Integer number) { | ||
if (number < 0) { | ||
throw new IllegalArgumentException("음수값은 허용하지 않음"); | ||
} | ||
list.add(number); | ||
} | ||
|
||
public static void main(String[] args) { | ||
MainRunner mainRunner = new MainRunner(); | ||
mainRunner.positiveAdd(-1); | ||
} | ||
} | ||
``` | ||
|
||
|
||
|
||
- #### IllegalStateException | ||
|
||
대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않을 때 주로 사용한다. | ||
|
||
|
||
|
||
예시 | ||
|
||
```java | ||
public class MainRunner { | ||
|
||
List<Integer> list = new ArrayList<>(); | ||
|
||
public void evenIndexAdd(Integer number){ | ||
if(list.size()%2 != 0){ | ||
throw new IllegalStateException("짝수 인덱스에 들어갈 준비가 되지 않음"); | ||
} | ||
list.add(number); | ||
} | ||
|
||
public static void main(String[] args) { | ||
MainRunner mainRunner = new MainRunner(); | ||
mainRunner.evenIndexAdd(0); | ||
mainRunner.evenIndexAdd(1); | ||
} | ||
} | ||
``` | ||
|
||
|
||
|
||
- #### NullPointerException | ||
|
||
null 값을 허용하지 않는 메서드에 null 을 건네는 경우 사용한다. | ||
|
||
|
||
|
||
예시 | ||
|
||
```java | ||
public class MainRunner { | ||
|
||
List<Integer> list = new ArrayList<>(); | ||
|
||
public void add(Integer number){ | ||
if(Objects.isNull(number)){ | ||
throw new NullPointerException("값이 null 입니다."); | ||
} | ||
list.add(number); | ||
} | ||
|
||
public static void main(String[] args) { | ||
MainRunner mainRunner = new MainRunner(); | ||
mainRunner.add(null); | ||
} | ||
} | ||
``` | ||
|
||
|
||
|
||
- #### IndexOutOfBoundsException | ||
|
||
시퀀스의 허용범위를 넘는 값을 건널때 사용한다. | ||
|
||
|
||
|
||
예시 | ||
|
||
```java | ||
public class MainRunner { | ||
|
||
List<Integer> list = new ArrayList<>(); | ||
|
||
public void add(Integer number){ | ||
if(list.size()>1){ | ||
throw new IndexOutOfBoundsException("요소를 3개 이상 설정 할 수 없습니다."); | ||
} | ||
list.add(number); | ||
} | ||
|
||
public static void main(String[] args) { | ||
MainRunner mainRunner = new MainRunner(); | ||
mainRunner.add(1); | ||
mainRunner.add(2); | ||
mainRunner.add(3); | ||
} | ||
} | ||
``` | ||
|
||
|
||
|
||
- #### ConcurrentModificationException | ||
|
||
단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 사용함. | ||
|
||
|
||
|
||
- #### UnsupportedOperationException | ||
|
||
클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때 던진다. | ||
|
||
대부분 객체는 자신이 정의한 메서드를 모두 지원하니 흔히 쓰이는 예외는 아니다. | ||
|
||
|
||
|
||
## 결론 | ||
|
||
상황에 부합한다면 항상 표준 예외를 재사용하자. 이때 API 문서를 참고해 그 예외가 어떤 상황에서 던져지는지 꼭 확인해야한다. | ||
|
||
예외의 이름뿐 아니라 예외가 던져지는 맥락도 부합할 때만 재사용한다. | ||
|
||
또한 더많은 정보를 제공하길 원한다면 표준예외를 확장해도 좋다. | ||
|
||
단 예외는 직렬화할 수 있다는 사실을 기억하자.(직렬화를 잘몰라서 무슨 뜻인지 모르겠네요) |