프로그래밍을 하다 보면 어느 날 갑자기 이런 에러 메시지들을 만나게 됩니다.
java.lang.NullPointerException
java.lang.OutOfMemoryError
둘 다 뭔가 문제가 있다는 건 알겠는데…
Error? Exception?
이게 뭐가 다른 걸까요?
이번 글에서는 자바에서 Error와 Exception이 각각 무엇인지, 그리고 이 둘의 차이점과 처리 방법에 대해 쉽게 설명해 드릴게요!
공통점
Error와 Exception 모두 자바에서 문제가 발생했을 때 사용하는 Throwable 클래스의 자식 클래스입니다.
java.lang.Throwable
├── java.lang.Error
└── java.lang.Exception
즉, 둘 다 "문제가 생겼어!" 라는 신호를 보내는 존재들입니다.
차이점
- Exception은 try-catch로 직접 처리할 수 있는 문제입니다.
→ 예외 상황에 대한 적절한 메시지 출력, 로그 기록, 복구 로직 등을 구현해 정상적인 프로그램 흐름을 유지해야 합니다. - Error는 try-catch로 처리할 수 없는 심각한 문제입니다.
→ 프로그램 흐름을 복구할 수 없기 때문에, 에러 발생 자체를 피할 수 있도록 코드 설계와 시스템 환경을 잘 관리하는 것이 중요합니다.
(예: 재귀 깊이 제한, 메모리 용량 확보, GC 튜닝 등
Exception(예외)이란?
개발자가 코드로 충분히 처리할 수 있는 문제입니다.
- 비즈니스 로직 실행 중 발생하는 예외적인 상황
- 개발자가 예측하고 대응할 수 있음
- try-catch 또는 throws로 명시적 처리 가능
예를 들어,
int[] arr = new int[3];
System.out.println(arr[5]);
이러한 코드가 있을 경우, ArrayIndexOutOfBoundsException 가 발생합니다!
배열의 범위를 넘어선 경우에요.
배열의 크기는 3인데, 배열 인덱스 5에 접근하려 해서 발생한 에러입니다.
이런 예외는 try-catch 문으로 잡아서 적절히 처리할 수 있어요.
Exception의 종류
Checked Exception (컴파일 시 체크)
- 반드시 try-catch 또는 throws로 처리해야 함
- 예: IOException, SQLException, FileNotFoundException
BufferedReader br = new BufferedReader(new FileReader("abc.txt")); // FileNotFoundException
Unchecked Exception (런타임 예외)
- 명시적 처리 필수 아님 (실행 중 발생)
- 예: NullPointerException, IllegalArgumentException, ArithmeticException
String str = null;
str.length(); // NullPointerException
Error(에러)란?
개발자가 처리하기 어려운 시스템적인 심각한 문제입니다.
- JVM 또는 시스템 레벨의 치명적인 문제
- 정상적인 프로그램 흐름에서 벗어남
- try-catch로 복구하거나 정상 처리로 전환하기 어려움
예를 들어,
public class StackOverflowTest {
public static void recursive() {
recursive(); // StackOverflowError 발생
}
public static void main(String[] args) {
recursive();
}
}
위 코드는 recursive 메서드를 계속 호출하는 상황입니다.
이렇게 될 경우 시스템이 무한루프에 빠져버리게 되어 결국 StackOverflowError가 발생하게 됩니다!
- OutOfMemoryError (메모리가 부족해요!)
- StackOverflowError (재귀 너무 깊어요!)
이런 에러(Error)는 예외(Exception)처럼 try-catch로 잡고 정상 흐름으로 되돌리기 어렵기 때문에, 근본적으로는 코드 수정이나 시스템 환경을 점검해 문제를 예방해야 합니다.
자주 발생하는 Error
에러 타입 | 설명 |
OutOfMemoryError | 힙 메모리가 부족할 때 |
StackOverflowError | 재귀 무한 호출 등으로 스택이 초과 |
InternalError | JVM 내부에서 알 수 없는 문제 |
NoClassDefFoundError | 필요한 클래스가 없음 |
➡ JVM 튜닝, 코드 수정, 환경 설정으로 해결해야 합니다.
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 34. 사용자 정의 예외 만들기 (0) | 2025.04.21 |
---|---|
[Java] 33. 예외(Exception) 처리 하기 (0) | 2025.04.21 |
[Java] 31. 내부 클래스란? (0) | 2025.04.18 |
[Java] 30. 추상 클래스와 인터페이스의 차이 (1) | 2025.04.18 |
[Java] 29. 인터페이스 (0) | 2025.04.18 |