CheckedException vs UnCheckedException

유경우·2024년 2월 26일
0

CS

목록 보기
12/21
post-custom-banner

들어가기 전

알고리즘 공부나 일반적인 프로그래밍을 하다 보면, Out of range와 같은 에러를 마주치는 경우가 자주 있습니다.
이는 주로 리스트나 배열의 인덱스에 접근할 때, 유효하지 않은 범위의 인덱스를 사용하려고 할 때 발생하는 오류입니다.

그런데 자바는 컴파일 언어인데 왜 실행시키기 전에 이런 에러들을 못 잡아주는 것일까요?

그 원인을 찾아보다 저는 Runtime Exception이란 개념에 대해 알게 되었습니다.

도대체 Exception이 뭐고 그 안에서 무슨 이유로 종류가 나뉘게 되었을까요?

예외의 종류


자바의 예외에는 3종류가 있습니다.
Error : 비정상적인 예외로 사용자가 대처하기 어렵고 처리할 방법도 없습니다.

CheckedException : 체크 예외는 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들입니다.
체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있습니다.

UnCheckedException : 언체크 예외는 RuntimeException의 하위 클래스들을 의미합니다.
이것은 체크 예외와는 달리 에러 처리를 강제하지 않습니다.
말 그대로 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.

Error

Error는 시스템 레벨에서 심각한 문제를 나타내며, 일반적으로 개발자가 처리할 수 없는 것들을 말합니다. 이러한 에러들은 자바 가상 머신(JVM)에서 발생하는 것으로, 애플리케이션의 정상적인 실행을 계속하기 어려울 정도로 심각한 문제입니다.

예시:

public class ErrorExample {
    public static void main(String[] args) {
        // 재귀적으로 메서드를 호출하여 StackOverflowError를 발생시킵니다.
        causeError();
    }

    public static void causeError() {
        causeError(); // 재귀 호출
    }
}

이 코드는 StackOverflowError를 발생시키는 예제입니다. causeError 메서드는 자기 자신을 무한히 호출하여 최종적으로 스택 오버플로우 에러를 일으킵니다. 이러한 에러는 일반적으로 코드 수정을 통해 예방할 수 있습니다.

Checked Exception

CheckedException은 컴파일 시점에 처리를 강제하는 예외 유형으로, 컴파일러가 에러 처리 코드의 존재를 확인합니다. 이는 주로 예측 가능한 상황에서 발생하며, 적절한 예외 처리를 통해 애플리케이션의 안정성을 높일 수 있습니다.

예시:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("non-existent-file.txt"));
            System.out.println(reader.readLine());
            reader.close();
        } catch (IOException e) {
            System.out.println("파일을 읽는 중 오류가 발생했습니다.");
        }
    }
}

이 코드는 파일을 읽으려고 할 때 발생할 수 있는 IOException을 처리하는 예제입니다. try-catch 블록을 사용하여 예외를 처리함으로써, 파일이 존재하지 않는 경우에도 프로그램이 안정적으로 동작하도록 합니다.

Unchecked Exception

UnCheckedException은 런타임 시점에 발생하며, 컴파일러가 예외 처리 코드의 존재를 강제하지 않는 예외 유형입니다. 주로 프로그래밍 오류나 잘못된 로직으로 인해 발생합니다.

예시:

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        System.out.println(numbers[3]); // ArrayIndexOutOfBoundsException 발생
    }
}

이 코드는 배열의 인덱스 범위를 벗어나 접근하려 할 때 발생하는 ArrayIndexOutOfBoundsException을 보여줍니다. 이는 UnCheckedException의 예로, 프로그램 실행 중에 발견되며, 주로 코드 검사와 테스트를 통해 예방할 수 있습니다.

요약

Error는 시스템 레벨의 심각한 문제를, CheckedException은 예측 가능한 예외 상황을, 그리고 UnCheckedException은 프로그램의 버그나 잘못된 로직에서 발생하는 예외를 각각 나타냅니다.

출처 : https://devlog-wjdrbs96.tistory.com/351
https://seungjjun.tistory.com/250
https://hahahoho5915.tistory.com/67
https://wildeveloperetrain.tistory.com/107

profile
개발자
post-custom-banner

0개의 댓글