메서드는 문제 없이 수행되었지만, 미래의 알 수 없는 시점에 메서드와 관련 없는 오류를 낼 수 있다
오류를 발생한 즉시 잡지 못하면, 해당 오류를 감지하기 어렵다
public과 protected 메서드는 예외를 문서화하자
@throws javadoc 태그를 사용해 매개변수 값이 잘못되었을 때 던지는 예외를 문서화 하자
매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술해야 한다
/**
* (현재 값 mod m) 값을 반환한다. 이 메서드는
* 항상 음이 아닌 BigInteger를 반환한다는 점에서 remainder 메서드와 다르다.
*
* @param m 계수(양수여야 한다.)
* @return 현재 값 mod m
* @throws ArithmeticException m이 0보다 작거나 같으면 발생한다.
*/
public BigInteger mod(BigInteger m) {
if (m.signum() <= 0)
throw new ArithmeticException("계수(m)은 양수여야 합니다. " + m);
... // 계산
}
이 메서드는 m이 null이면 m.signum() 호출 시 NullPointerException 을 던진다
그런데, m이 null일 때, NullPointerException 을 던진다는 말은 메서드 설명 어디에도 없다
그 이유는, 이 설명을 개별 메서드가 아닌 BigInteger 클래스 수준에서 기술했기 때문이다
클래스 수준 주석은 그 클래스의 모든 public 메서드에 적용되므로 훨씬 깔끔하다는 장점이 있다
아이템 49. 매개변수가 유효한지 검사하라
매개변수 검사를 제대로 하지 못하면 발생하는 문제
public과 protected 메서드는 예외를 문서화하자
@throws
javadoc 태그를 사용해 매개변수 값이 잘못되었을 때 던지는 예외를 문서화 하자m.signum()
호출 시NullPointerException
을 던진다NullPointerException
을 던진다는 말은 메서드 설명 어디에도 없다BigInteger
클래스 수준에서 기술했기 때문이다Java 7에 추가된
java.util.Objects.requireNonNull
메서드null
검사를 수행할 수 있다공개되지 않은 (public 이 아닌) 메서드라면 단언문 (assert)을 사용하여 매개변수 유효성을 검증할 수 있다
AssertionError
를 던진다메서드가 직접 사용하지는 않는데, 나중에 사용하기 위해 저장하는 매개변수
Objects.requireNonNull
을 생략했다면, 클라이언트가 반환된 List를 사용하려할 때NullPointerException
이 발생한다메서드 실행 전 매개변수 검사 예외의 경우