Method Parameter and Exception Handling

Tags: JavaEffective JavaMethod ParameterException

April 12, 2017

NullOrZero

오늘 회사에서 코드리뷰를 하다가 나온 내용을 하나 올려본다. 대단한 내용은 아니고 어떻게든 포스팅 하나정도 해야할 것 같아서..

메소드에 인스턴스를 하나 넘겨주는데 값을 먼저 확인해서 null일 경우 NullPointerException을 던지는 코드였다.

void method(Object o) {
  if(o == null) {
    throw new NullPointerException();
  }
  // do something..
}

넘겨받은 값이 원하는 조건에 맞지 않아서 예외처리를 하는 코드여서 NullPointerException보다는 IllegalArgumentException이 더 어울리지 않냐고 코멘트를 달았는데, 그 친구는 다른 대꾸없이 Effective Java 2/E - item 60 의 내용을 답변으로 달았다. 간단히 아래와 같다.

  • IllegalArgumentException: null은 아니지만 값이 적절하지 않을 때
  • IllegalStateException: 객체의 상태가 메소드를 호출하기에 적절하지 않을 때. 예를들어 객체가 제대로 초기화 되기 전에 메소드를 호출했을 경우
  • NullPointerException: null을 허용하지 않는데 받았을 때
  • IndexOutOfBoundsException: 인덱스 값이 [ArrayList의] 범위에 들어가지 않을 때
  • ConcurrentModificationException: 동시성(Concurrency)을 지원하지 않는데 동시에 객체를 수정하려는 시도가 있을 때
  • UnsupportedOperationException: 객체가 지원하는 메소드가 아닐 때

두 개를 제외한 다른 예외는 모두 조건이 아주 명료하다. NullPointerExceptionIllegalArgumentException만 제대로 구분하면 될 것 같다. 역시 null은 태어났으면 안됐다.. Null References: The Billion Dollar Mistake

void setAge(int age) {
  if(age < 0) {
    throw new IllegalArgumentException();
  }
  // do something..
}

위와 같이 논리적으로 값이 음수가 되면 안 될 경우에는 IllegalArgumentException을 사용하면 된다.