아이템 71. 필요없는 검사 예외 사용은 피하라
검사예외는 발생한 문제를 프로그래머가 처리하여 안전성을 높이게끔 해준다. 어떤 메서드가 검사 예외를 던질 수 있다고 선언됐다면, 이를 호출하는 코드에서는 catch블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야만 한다. 더구나 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8 부터는 부담이 더욱 커졌다.
과연 다음이 최선인가 ?
} catch(TheCheckedException e){
throw new AssertionError(); // 일어날 수 없다.
}아니면 다음 방식은 어떤가 ?
} catch(ThecCheckedException e){
e.printStackTrace(); // 이런 우리가 졌다.
System.exit(1);
}더 나은 방법이 없다면 비검사 예외를 선택해야 한다.
검사예외를 회피하는 가장 쉬운 방법은 적절한 결과 타입을 담은 옵셔널을 반환하는것이지만 단점이라면 예외가 발생한 이유를 알려주는 부가 정보를 담을 수 없다는 것이다. 반면, 예외를 사용하면 구체적인 예외 타입과 그 타입이 제공하는 메서드들을 활용해 부가 정보를 제공할 수 있다. 또다른 방법으로는 검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꿀 수 있다 . 이 방식에서 첫번째 메서드는 예외가 던져질지 여부를 boolean값으로 반환한다.
try {
obj.action(args);
} catch (TheCheckedException e){
... // 예외 상황에 대처한다.
}리팩토링 하면 다음과 같이 된다.
if (obj.actionPermitted(args)){
obj.action(args);
}else {
... //예외 상황에 대처한다.
}매번 이렇게 적용가능한건 아니지만 적용할 수 있다면 더 쓰기 편한 API를 제공한다. 한편 actionPermitted 는 상태 검사 메서드 이므로, 외부 요인에 의해 상태가 변할 수 있다면 이 리팩토링은 적절하지 않다.