자바 예외 공부하다가 헷갈려서 질문 남깁니다. checked 예외랑 unchecked 예외라는 게 있다는 건 알겠는데, 실제로 코드 짤 때 뭘 언제 써야 하는지 감이 안 잡히네요.
제가 이해한 건 이 정도예요. IOException 같은 건 컴파일러가 try-catch 하거나 throws 붙이라고 강제하는데, NullPointerException이나 IllegalArgumentException 같은 건 안 그러더라고요. 전자가 checked, 후자가 unchecked인 거죠?
그래서 궁금한 게, 제가 직접 예외 클래스를 만들 때 RuntimeException을 상속해야 하나요 아니면 그냥 Exception을 상속해야 하나요? 지금은 그냥 아무 생각 없이 Exception 상속해서 쓰고 있는데, 이러니까 이 예외를 던지는 메서드마다 throws를 계속 달아야 하고 호출하는 쪽도 try-catch를 강제로 해야 해서 코드가 지저분해지더라고요.
public class OrderException extends Exception {
public OrderException(String msg) {
super(msg);
}
}
public void placeOrder(Order o) throws OrderException {
if (o.getItems().isEmpty()) {
throw new OrderException("주문 항목이 비어있음");
}
}
이걸 RuntimeException 상속으로 바꾸면 throws 안 달아도 되긴 하는데, 그럼 아예 잡지도 못하고 넘어가버리는 거 아닌가 싶어서 불안하기도 하고요. 실무에서는 보통 어떤 기준으로 checked랑 unchecked를 나누나요? 검색해보면 "복구 가능하면 checked" 이런 말이 나오는데 그 복구 가능하다는 게 정확히 무슨 뜻인지도 잘 모르겠어요. 예를 들면 위에 주문 비어있는 경우는 복구 가능한 건가요 아닌가요? 실전 감각으로 좀 알려주시면 감사하겠습니다.