Post

Item 72 - 표준 예외를 사용하라

코드를 재사용하면 이점이 많듯이 예외도 마찬가지다.

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

표준 예외의 장점 👍

  • 표준이기 때문에 다른 개발자가 코드를 보고 예외의 의미를 이해하기 쉬워진다.
  • 예외 클래스 수가 적을수록 메모리 사용량과 클래스를 적재하는 시간을 아낄 수 있다.
  • 직렬화에도 용이하다.

가장 많이 사용되는 표준 예외 😄

IllegalArgumentException

  • 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외
  • ex) 반복 횟수를 지정하는 매개변수에 음수값을 건넬 때
  • 특수한 경우
    • null을 허용하지 않는 메서드에 null을 넘길 경우 NPE
    • 어떤 시퀀스의 허용 범위를 넘는 값을 건네면 IndexOutOfBoundsException

IllegalStateException

  • 대상 객체가 호출된 메서드를 수행하기에 적절하지 않은 상태일 때 던지는 예외
  • ex) 초기화되지 않은 객체를 사용하려 할 때

NullPointerException

  • null을 허용하지 않는 메서드에 null을 건넸을 때 발생하는 예외

IndexOutOfBoundsException

  • 인덱스의 범위를 넘어섰을 때 발생하는 예외

ConcurrentModificationException

  • 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 던지는 예외
  • 문제가 생길 가능성을 알려주는 정도의 역할로 쓰인다.

UnsupportedOperationException

  • 호출자가 요청한 동작을 대상 객체가 지원하지 않을 때 발생하는 예외
  • 보통 구현하려는 인터페이스의 메서드 일부를 구현할 수 없을 때 사용
  • ex) add만 가능한 List의 구현 객체에 remove 요청을 할 경우 발생

예외 재사용 시 주의 사항 💣

Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자.

  • 그냥 추상 클래스라고 생각하자.
  • 여러 성격의 다른 예외들을 포괄하는 상위 클래스이므로 안정적으로 테스트할 수 없다.

예외는 직렬화할 수 있다.

  • 예외에서 더 많은 정보를 제공하길 원한다면 표준 예외를 확장해도 좋다.
  • 단, 예외는 직렬화할 수 있다는 점을 고려하자.
  • 직렬화에는 많은 부담이 따르니 나만의 예외가 꼭 필요한지 생각해보자.

표준 예외중에 어떤 걸 사용해야 할지 헷갈린다면?

IllegalArgumentException VS IllegalStateException

  • 표준 예외들의 주요 쓰임이 상호 배타적이지 않기 때문에 선택하기 어려울 수 있다.
  • ex) 카드 덱 객체가 있고, 인수로 건넨 수만큼의 카드를 뽑아 나눠주는 메서드가 있다.
  • 이때 덱에 남아있는 카드 수보다 큰 값을 건네면 어떤 예외를 던져야할까?
    • 인수의 값이 너무 크다는 관점 : IllegalArgumentException
    • 덱에 남은 카드 수가 너무 적다는 관점 : IllegalStateException
  • 일반적인 규칙
    • IllegalStateExceptpion: 인수 값이 잘못 들어왔는데, 무엇이었든 어차피 실패했을 경우
    • IllegalArguementException: 인수 값이 정상으로 들어왔다면 성공했을 경우
This post is licensed under CC BY 4.0 by the author.