본문 바로가기

개발/이펙티브 자바

Effective Java ( 이펙티브 자바 ) - 아이템 72

표준 예외를 사용하라


  숙련된 프로그래머는 그렇지 못한 프로그래머보다 더 많은 코드를 재사용한다. 예외도 마찬가지로 재사용하는 것이 좋으며, 자바 라이브러리는 대부분 API에서 쓰기에 충분한 수의 예외를 제공한다. 

 

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

  • 그중 최고는 여러분의 API가 다른 사람이 익히고 사용하기 쉬워진다는 것이다. 
  • 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.

 

  가장 많이 재사용되는 예외는 IllegalArgumentException이다. 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외로, 예를 들어 반복 횟수를 지정하는 매개변수에 음수를 건넬 때 쓸 수 있다. 

 

  IllegalStateException도 자주 재사용된다. 이 예외는 대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않을 때 주로 던진다. 제대로 초기화되지 않은 객체를 사용하려 할 때 던질 수 있다.

 

  메서드가 던지는 모든 예외를 잘못된 인수나 상태라고 뭉뚱그릴 수도 있겠지만, 그중 특수한 일부는 따로 구분해 쓰는 게 보통이다. null 값을 허용하지 않는 메서드에 null을 건네면 관례상 IllegalArgumentException이 아닌 NullPointerException을 던진다. 비슷하게 시퀸스의 허용 범위를 넘는 값을 건넬 때도 IndexOutOfBoundsException을 던진다. 

 

  재사용하기 좋은 또 다른 예외인 ConcurrentModificationException은 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 던진다.

 

  UnsupportedOperationException은 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때 던진다. 대부분 객체는 자신이 정의한 메서드를 모두 지원하니 흔히 쓰이는 예외는 아니다. 원소를 넣을 수만 있는 List 구현체에 대고 누군가 remove 메서드를 호출하면 이 예외를 던질 것이다.

 

Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자. 이 클래스들은 추상 클래스라고 생각하길 바란다.

이 예외들은 다른 예외들의 상위 클래스이므로, 안정적으로 테스트할 수 없다.

 

위의 예외 이외에도 상황에 맞게 다른 예외도 재사용할 수 있다. 예컨대 ArithmeticException, NumberFormatException을 재사용할 수 있을 것이다. 

상황에 부합한다면 항상 표준 예외를 재사용하자. 예외의 이름뿐 아니라 예외가 던져지는 맥락도 부합할 때만 재사용한다. 
더 많은 정보를 제공하길 원한다면 표준 예외를 확장해도 좋다. 단 예외는 직렬화할 수 있으므로 많은 부담이 따를 수 있다(12장).
인수 값이 무엇이었든 어차피 실패했을 거라면 IllegalStateException, 그렇지 않으면 IllegalArgumentException을 던지자.