프로그래밍 언어/Java

[Java] 32. Error(오류) vs Exception(예외)

WooZzing 2025. 4. 21. 15:12

 

 

 

 

프로그래밍을 하다 보면 어느 날 갑자기 이런 에러 메시지들을 만나게 됩니다.

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 튜닝, 코드 수정, 환경 설정으로 해결해야 합니다.

 

 

 

 

읽어주셔서 감사합니다 😊