Java에서 RuntimeException 클래스를 상속하면 사용자 정의 비검사 예외(Unchecked Exception)를 손쉽게 만들 수 있습니다.
비검사 예외는 Error 클래스 또는 RuntimeException 클래스를 상속하는 예외를 말합니다. 많은 개발자들은 이러한 예외가 프로그램 실행 중 복구를 기대하기 어려운 종류의 오류를 나타내기 때문에 애플리케이션 코드에서 처리하지 않는 것이 일반적이라고 생각합니다. 비검사 예외가 발생하는 원인은 대부분 코드의 잘못된 사용, null 값 전달, 또는 그 외 잘못된 인수 전달 같은 프로그래밍 실수에 있습니다.
기본 문법
public class MyCustomException extends RuntimeException {
public MyCustomException(String message) {
super(message);
}
}비검사 예외 구현하기
사용자 정의 비검사 예외의 구현 방법은 검사 예외(Checked Exception)와 거의 동일합니다. 유일한 차이점은 Exception이 아닌 RuntimeException을 상속해야 한다는 점입니다.
전체 예제
실무에서는 다양한 상황에 대응할 수 있도록 여러 생성자를 함께 정의하는 것이 좋습니다. 아래 예제는 메시지만 전달하는 생성자, 원인 예외만 감싸는 생성자, 그리고 두 가지를 모두 전달하는 생성자를 포함합니다.
public class CustomUncheckedException extends RuntimeException {
/*
* 예외를 던질 때 사용자 정의 메시지를 추가하고 싶은 경우 사용합니다.
* 예: throw new CustomUncheckedException("Custom Unchecked Exception");
*/
public CustomUncheckedException(String message) {
// super() 호출 시 모든 상위 클래스의 생성자가 연쇄적으로 호출되어
// 완전한 스택 트레이스(stacktrace)가 생성됩니다.
super(message);
}
/*
* catch 블록에서 발생한 예외를 감싸서(wrap) 다시 던지고 싶은 경우 사용합니다.
* 예: catch (ArrayIndexOutOfBoundsException e) {
* throw new CustomUncheckedException(e);
* }
*/
public CustomUncheckedException(Throwable cause) {
// 적절한 부모 생성자를 호출합니다.
super(cause);
}
/*
* 메시지와 원인 예외를 모두 전달하고 싶은 경우 사용합니다.
* 예: catch (ArrayIndexOutOfBoundsException e) {
* throw new CustomUncheckedException(e, "File not found");
* }
*/
public CustomUncheckedException(String message, Throwable throwable) {
// 적절한 부모 생성자를 호출합니다.
super(message, throwable);
}
}사용 예시
정의한 사용자 정의 예외는 다음과 같이 비즈니스 로직에서 활용할 수 있습니다.
public class Main {
public static void main(String[] args) {
try {
validateAge(-5);
} catch (CustomUncheckedException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
static void validateAge(int age) {
if (age < 0) {
throw new CustomUncheckedException("나이는 음수일 수 없습니다: " + age);
}
System.out.println("유효한 나이입니다: " + age);
}
}