알고리즘 공부나 일반적인 프로그래밍을 하다 보면, Out of range와 같은 에러를 마주치는 경우가 자주 있습니다.
이는 주로 리스트나 배열의 인덱스에 접근할 때, 유효하지 않은 범위의 인덱스를 사용하려고 할 때 발생하는 오류입니다.
그런데 자바는 컴파일 언어인데 왜 실행시키기 전에 이런 에러들을 못 잡아주는 것일까요?
그 원인을 찾아보다 저는 Runtime Exception
이란 개념에 대해 알게 되었습니다.
도대체 Exception
이 뭐고 그 안에서 무슨 이유로 종류가 나뉘게 되었을까요?
자바의 예외에는 3종류가 있습니다.
Error
: 비정상적인 예외로 사용자가 대처하기 어렵고 처리할 방법도 없습니다.
CheckedException
: 체크 예외는 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들입니다.
체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있습니다.
UnCheckedException
: 언체크 예외는 RuntimeException의 하위 클래스들을 의미합니다.
이것은 체크 예외와는 달리 에러 처리를 강제하지 않습니다.
말 그대로 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.
Error
는 시스템 레벨에서 심각한 문제를 나타내며, 일반적으로 개발자가 처리할 수 없는 것들을 말합니다. 이러한 에러들은 자바 가상 머신(JVM)에서 발생하는 것으로, 애플리케이션의 정상적인 실행을 계속하기 어려울 정도로 심각한 문제입니다.
public class ErrorExample {
public static void main(String[] args) {
// 재귀적으로 메서드를 호출하여 StackOverflowError를 발생시킵니다.
causeError();
}
public static void causeError() {
causeError(); // 재귀 호출
}
}
이 코드는 StackOverflowError
를 발생시키는 예제입니다. causeError
메서드는 자기 자신을 무한히 호출하여 최종적으로 스택 오버플로우 에러를 일으킵니다. 이러한 에러는 일반적으로 코드 수정을 통해 예방할 수 있습니다.
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
블록을 사용하여 예외를 처리함으로써, 파일이 존재하지 않는 경우에도 프로그램이 안정적으로 동작하도록 합니다.
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