Skip to content

Commit

Permalink
[#72][A팀] 표준 예외를 사용하라
Browse files Browse the repository at this point in the history
[#72][A팀] 표준 예외를 사용하라
  • Loading branch information
ksy90101 authored Mar 27, 2021
2 parents b81beeb + 6cd6a55 commit de926a2
Showing 1 changed file with 162 additions and 0 deletions.
162 changes: 162 additions & 0 deletions 10장/72_표준_예외를_사용하라_김재준.md
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 문서를 참고해 그 예외가 어떤 상황에서 던져지는지 꼭 확인해야한다.

예외의 이름뿐 아니라 예외가 던져지는 맥락도 부합할 때만 재사용한다.

또한 더많은 정보를 제공하길 원한다면 표준예외를 확장해도 좋다.

단 예외는 직렬화할 수 있다는 사실을 기억하자.(직렬화를 잘몰라서 무슨 뜻인지 모르겠네요)

0 comments on commit de926a2

Please sign in to comment.