#59 checked 예외의 불필요한 사용을 피하자
checked 예외는 프로그래머가 직접 try-catch문이나 throws 키워드를 통해 처리해야 합니다.
이 checked 예외가 많아지면, 둘 중 어떤 방식으로 해도 프로그래머에겐 큰 부담입니다.
이 부담을 줄이기 위한 방법에 대해 알아보겠습니다.
만약 아래와 같이 checked 예외를 catch문에서 새로운 예외로 throw 하거나, 아무런 처리를 못한다면, checked 예외 처리가 아무런 의미가 없습니다.
try {
//
} catch(TheCheckedException e) {
throw new AssertionError();
}
try {
//
} catch(TheCheckedException e) {
e.printStackTrace();
System.exit(1);
}
무의미한 checked 예외는 unchecked 예외로 바꾸는 게 더 적합합니다.
// checked 예외를 사용한 메서드 호출
try {
obj.action(args);
} catch(TheCheckedException e) {
// 예외 처리...
}
checked 예외를 unchecked 예외로 바꾸는 한 가지 방법은, 예외를 발생시키는 메서드를 두 개의 메서드로 쪼개는 것입니다.
- 첫 번째 메서드는 예외가 생겼는지 판단하는 boolean 값을 반환하는 상태-검사 메서드입니다.
- 두 번째 메서드는 상태-검사 메서드의 결과를 기반으로 동작하는 메서드입니다.
// 상태-검사 메서드와 unchecked 예외를 사용한 메서드 호출
if (obj.actionPermitted(args)) {
obj.action(args)
} else {
// 예외 처리...
}
이러한 코드 변환은 깔끔하진 않지만 checked 예외 처리가 없기 때문에 API 사용성은 좋아집니다.
하지만 멀티 스레드 환경에서 동기화하지 않고 동시적으로 상요한다면, 상태-검사 메서드의 값이 불안정하기 때문에 적합하지 않습니다.