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

Java 런타임 예외(Runtime Exception)란? 주요 종류와 처리 방법 총정리

런타임 예외(Runtime Exception)는 Java 프로그래밍 언어에서 발생 시 프로그램이나 애플리케이션의 비정상 종료를 유발할 수 있는 모든 예외들의 부모 클래스입니다. 일반적인 확인된 예외(Checked Exception)와 달리, 런타임 예외는 컴파일러에 의해 강제로 검사되지 않는 비검사 예외(Unchecked Exception)에 해당합니다.

런타임 예외의 특징

런타임 예외는 대체로 프로그램이 정상적으로 처리해야 할 외부 조건보다는 개발자의 코드 오류(프로그래밍 버그)를 나타내는 경우가 많습니다. 또한 논리적으로 발생할 수 없는 상황을 표현할 때도 사용됩니다.

다만 주의할 점이 있습니다. 프로그램의 메모리가 부족해지는 OutOfMemoryError 같은 심각한 시스템 오류는 런타임 예외가 아닌 별도의 에러(Error)로 분류되어 throw 됩니다.

가장 흔히 발생하는 런타임 예외 3가지

1. NullPointerException

NullPointerException은 JVM(Java Virtual Machine)이 던지는 예외로, null로 설정된 객체에 대해 어떤 연산을 수행하거나 null 객체의 메서드를 호출하려 할 때 발생합니다. 이 예외를 단순히 try-catch로 감싸 처리하면 문제를 임시로 가릴 뿐 근본적으로 해결하지 못하므로, catch문으로 처리하기보다 null 여부를 사전에 검증하는 코드를 작성하는 것이 바람직합니다.

2. ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException은 Java 프로그램이 배열에 존재하지 않는 위치에 잘못 접근하려 할 때 JRE(Java Runtime Environment)가 자동으로 던지는 예외입니다. 요청한 인덱스가 음수이거나, 배열의 크기보다 크거나 같을 때 주로 발생합니다.

Java 배열은 0 기반 인덱싱(zero-based indexing)을 사용하므로, 첫 번째 요소의 인덱스는 0, 마지막 요소의 인덱스는 (배열 크기 - 1), n번째 요소의 인덱스는 n-1입니다. 이 규칙을 항상 염두에 두면 이 예외를 예방할 수 있습니다.

3. InvalidArgumentException

InvalidArgumentException은 서버의 참조 연결(connection)에서 특정 메서드에 유효하지 않은 매개변수가 전달될 때 발생하는 예외입니다. 메서드 호출 전에 인자 값의 유효성을 검사하는 습관이 중요합니다.

커스텀 런타임 예외 만들고 처리하기

RuntimeException을 상속받아 사용자 정의 예외를 만들고, try-catch 블록으로 처리하는 기본적인 방법은 다음과 같습니다.

public class MyExceptionTest {
    public void testRuntimeException() {
        throw new MyException();
    }
    public static void main(String[] args) {
        try {
            new MyExceptionTest().testRuntimeException();
        } catch(Exception e) {
            System.out.println(e.getClass().getName());
        }
    }
}
class MyException extends RuntimeException {
    public MyException() {
        super();
    }
}

실행 결과

MyException

런타임 예외 처리 핵심 정리

  • 런타임 예외는 컴파일 시점에 검사되지 않으므로, 개발자가 방어적 프로그래밍을 통해 사전에 차단해야 합니다.
  • NullPointerException은 null 검사(Optional 활용 포함), ArrayIndexOutOfBoundsException은 인덱스 범위 검사로 예방할 수 있습니다.
  • try-catch 처리는 예외를 "숨기는" 용도가 아니라, 로깅이나 복구 로직 등 명확한 목적이 있을 때 사용해야 합니다.