Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 사용자 정의 비검사 예외(Unchecked Exception) 만드는 방법

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);
    }
}