우리는 "오류는 가능한 한 빨리 (발생한 곳에서) 잡아야한다" 는 원칙을 지키기위해 노력해야한다.
오류를 발생한 즉시 잡지 못하면 해당 오류를 감지하기 어려워지고, 감지하더라도 오류의 발생 지점을 찾기 어려워진다.
메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다.
매개변수 검사를 제대로 하지 못하였을 때 발생하는 문제가 몇 가지 있는데
메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다.
더 나쁜 상황은 메서드가 잘 수행되지만 잘못된 결과를 반환할 때이며, 더 나쁜 상황은 메서드는 문제없이 수행됐지만, 어떤 객체를 이상한 상태로 만들어놓아서 미래의 알 수 없는 시점에 이 메서드와는 관련 없는 오류를 낼 때다.
public, protected 메서드는 매개변수 값이 잘못됐을 때 던지는 예외를 문서화 해야한다.(@throws 자바독 태그 사용) ⇒ IllegalArgumentException, IndexOutOfBoundsException, NullPointerException ...
매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술하기!
/*
* 항상 음이 아닌 BigInteger를 반환한다는 점에서 remainder 메서드와 다르다.
*
* @param m 계수 (양수여야 한다.)
* @return 현재 값 mod m
* @throws ArithmeticException m이 0보다 작거나 같으면 발생한다.
*/
public BigInteger mod(BigInteger m){
if(m.signum() <= 0){
throws new ArithmeticException("계수(m)는 양수여야 합니다. " + m);
}
...
}
자바 7에서는 java.util.Objects.requireNonNull 메서드가 추가되었다. 이 메서드는 유연하고 사용하기도 편하며 더 이상 null 검사를 수동으로 하지 않아도 된다.
// 매개변수가 유효한지 검사하자
public static void checkMethod1(String str){
System.out.println(Objects.requireNonNull(str, "파라미터 문자열이 null 인데..."));
System.out.println("문자열관련 계산을 수행합니다....");
}
// 파라미터를 null로 넘긴다면..
Exception in thread "main" java.lang.NullPointerException: 파라미터 문자열이 null 인데...
at java.base/java.util.Objects.requireNonNull(Objects.java:246)
at com.corn.toy.effective.item49.Main.checkMethod1(Main.java:14)
at com.corn.toy.effective.item49.Main.main(Main.java:8)
결론
메서드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다. 그 제약들을 문서화하고 메서드 코드 시작 부분에서 명시적으로 검사해야 한다. 이런 습관을 반드시 기르자. 그 노력은 유효성 검사가 실제 오류를 처음 걸러낼 때 충분히 보상받는다.
'프로그래밍 노트 > Effective 시리즈' 카테고리의 다른 글
메서드 시그니처를 신중히 설계하자 (API 설계 요령) (0) | 2020.01.12 |
---|---|
자바 명명규칙 (Naming Rule, Naming Convention) 컨벤션 (0) | 2020.01.12 |
null이 아닌, 빈 컬렉션이나 배열을 반환해야 한다. (2) | 2020.01.07 |
스트림은 주의해서 사용해야한다. (0) | 2020.01.06 |
표준 함수형 인터페이스를 사용하자. (0) | 2020.01.01 |