1. 메서드와 매개변수
- 메서드의 입력 매개변수 값에는 제약 조건이 있을 수 있다.
- ex) 인덱스 값은 음수이면 안된다.
- ex) 객체 참조는
null
이 아니어야 한다.
- 매개변수가 이러한 제약 조건을 위배하지 않는지는 메서드 body가 시작되기 전에 검사해주는 것이 좋다.
- 오류는 가능한 한 빨리 잡아야 하기 때문
- 오류를 발생한 즉시 잡지 못하면(문제가 생긴채로 어딘가에 저장되어 버리면) 해당 오류를 감지하기 어려워지고, 감지하더라도 오류의 발생 지점을 찾기 어려워진다.
2. 매개변수 검사를 하지 않으면 생길 수 있는 문제
- 메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다.
- 메서드는 잘 수행되지만 잘못된 결과를 반환할 수 있다.
- 메서드는 잘 수행되지만 어떠한 객체의 상태를 변화시켜서 미래의 알 수 없는 시점에 이 메서드와 관련 없는
오류가 발생할 수 있다.
3. 매개변수 관련 예외를 문서화 하는 방법
- 메서드의 매개변수 값이 잘못됐을 때 발생되는 예외를 문서화하면 개발자가 매개변수 관련 오류를
발생시킬 위험을 줄일 수 있다.
@throws
자바독 태그를 사용할 수 있다.
- 매개변수의 제약을 문서화 할 때는 제약을 어겼을 시 발생하는 예외도 함께 기술해주는 것이 좋다.
- 일반적으로 발생하기 쉬운 예외
IllegalArgumentException
, IndexOutOfBoundsException
, NullPointerException
/**
* (현재 값 mod m) 값을 반환한다.
* 이 메서드는 항상 음이 아닌 BigInteger를 반환한다는 점에서 remainder 메서드와 다르다.
*
* @param m (계수 : 양수여야 한다)
* @return mod m (현재 값)
* @throws ArithmeticException (m 이 0 이하이면 발생한다)
*/
public BigInteger mod(BigInteger m) {
if (m.signum() < 0) // m이 양수면 1, 0이면 0, 음수면 -1 반환
throw new ArithmeticException("계수(m)는 양수여야 합니다. " + m);
...
}
m == null
이면 m.signum
호출시 NullPointerException
예외가 발생한다.
- 위 사항이 메서드 설명에서 언급되지 않는 이유
- 이 설명은 메서드가 아닌,
BigInteger
클래스 수준에 기술되어 있기 때문이다.
- 모든 메서드에 일일이 주석을 작성해두는 것 보다, 클래스 단계에 주석을 한 번만 작성해두는 것이
훨씬 간편한 경우가 많다.
4. 매개변수 검사에 사용할 수 있는 유용한 메소드