Skip to content

Latest commit

 

History

History
162 lines (93 loc) · 3.86 KB

72_표준_예외를_사용하라_김재준.md

File metadata and controls

162 lines (93 loc) · 3.86 KB

ITEM 72

표준 예외를 사용하라.

자바 라이브러리는 대부분 API 에서 쓰기에 충분한 수의 예외를 제공한다.

표준 예외를 재사용하면 얻는 게 많다.

  1. API가 다른 사람이 익히고 사용하기 쉬워진다는 것
  2. API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽게 된다는 장점
  3. 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.

자주 재사용하는 예외

  • IllegalArgumentException

    호출자가 인수로 부적절한 값을 넘길 때 던지는 예외

    예시

    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

    대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않을 때 주로 사용한다.

    예시

    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 을 건네는 경우 사용한다.

    예시

    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

    시퀀스의 허용범위를 넘는 값을 건널때 사용한다.

    예시

    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 문서를 참고해 그 예외가 어떤 상황에서 던져지는지 꼭 확인해야한다.

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

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

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