개발자는 기록이 답이다

🐙 Java에서 Exception과 Error의 차이점 본문

언어/Java

🐙 Java에서 Exception과 Error의 차이점

slow-walker 2023. 12. 22. 14:39

 

Exception과 Error의 차이점

 

Exception과 Error는 모두 자바에서 예외 처리 관련된 클래스들을 나타낸다. 그러나 두 개의 주요 차이점이 있다.

특성 Exception(예외) Error(에러)
발생 원인 주로 프로그램 외부 요인으로 발생 주로 가상머신 같은 시스템 레벨에서 발생
메인보드 고장, 디스크 고장 등
처리 여부 개발자가 명시적으로 처리 가능 주로 프로그램이 직접 처리하지 않음
예시 NullPointException,
IOException
OutOfMemoryError, 
StackOverflowError, 
NoClassDefFoundError
처리 방법 try-catch 블록을 사용하여 예외 처리 일반적으로 프로그램이 직접 처리하지 않음
예외 처리 가능 여부 일반적으로 예외 처리 가능 예외 처리 어려움 및 불가능
상속 관계 Throwable 클래스를 상속받음 Throwable 클래스를 상속받음
영향력 스레드에만 영향 프로세스에 영향

 

※ 예외 종류 참고 docs https://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

Exception 예시

 

  • NullPointException: null인 참조 변수를 사용하여 객체의 메서드나 속성을 호출할 때 발생한다. 즉, 객체가 초기화되지 않은 상태에서 해당 객체의 메서드나 속성을 사용하려고 할 때 발생한다.
public class NullPointerExceptionExample {
    public static void main(String[] args) {
        String str = null;
        try {
            System.out.println(str.length()); // null에 대한 메서드 호출
        } catch (NullPointerException e) {
            System.err.println("NullPointerException 발생: " + e.getMessage());
        }
    }
}

 

  • IOException: 입출력 작업 중에 예외적인 상황이 발생할 때 발생한다. 파일을 읽거나 쓸 때 파일이 존재하지 않거나, 권한이 없는 등의 상황에서 IOException이 발생할 수 있다.
import java.io.FileInputStream;
import java.io.IOException;

public class IOExceptionExample {
    public static void main(String[] args) {
        try {
            FileInputStream file = new FileInputStream("nonexistent_file.txt");
        } catch (IOException e) {
            System.err.println("IOException 발생: " + e.getMessage());
            // 예외를 처리하는 추가적인 로직을 여기에 추가할 수 있습니다.
        }
    }
}

Error의 예시

  • OutOfMemoryError: 힙 메모리가 모두 사용되어 더 이상 객체를 생성할 수 없을 때 발생한다. 주로 메모리 누수나 대용량 데이터 처리 등으로 인해 발생할 수 있다.
List<Object> list = new ArrayList<>();
while (true) {
    list.add(new Object());
}
  • StackOverflowError: 재귀 호출이 너무 깊게 이루어지거나 무한 루프로 인해 호출 스택이 가득 차서 발생한다.
public class RecursiveExample {
    public static void recursiveMethod() {
        recursiveMethod();
    }
    public static void main(String[] args) {
        recursiveMethod();
    }
}

 

  • NoClassDefFoundError: 클래스를 찾을 수 없는 경우 발생. 클래스 패스에 해당 클래스가 없거나, 클래스 파일이 손상된 경우에 발생할 수 있다.

  • LinkageError: 클래스 로딩 또는 링킹 단계에서 발생하는 오류로, 클래스 간의 의존성 문제 등으로 인해 발생할 수 있다.

  • VirtualMachineError: 가상 머신 내부에서 발생하는 오류로서, 일반적으로 프로그램이 직접 처리할 수 없는 치명적인 오류이다.

Throwable 클래스는 어떤 역할을 할까?

Exception과 Error의 공통 부모 클래스는 당연히 Object클래스이다.

그리고, 공통 부모 클래스가 또 하나 있는데 java.lang패키지에 선언한 Throwable 클래스이다.

맨 위 상단의 그림을 보면 Throwable은 다시 두 하위 클래스로 나뉘는데, Exception과 Error이 있는것을 볼 수 있다.

따라서 자바에서 예외와 오류는 모두 Throwable 클래스를 상속받아 구현된다.

이 클래스는 예외와 오류를 모두 처리할 수 있는 catch 블록을 만들 수 있게 해주며, 예외와 오류의 공통적인 특징을 정의한다.

Throwable을 통해서 모든 예외를 처리할 수도 있지만, 예외 처리를 세분화해서 각 예외 타입에 맞게 처리하는게 권장된다.

public class ThrowableExample {
    public static void main(String[] args) {
        try {
            // 예외 발생 예시: 배열의 길이를 초과하여 접근
            int[] arr = new int[5];
            System.out.println(arr[10]);
        } catch (Throwable throwable) {
            // Throwable 클래스를 이용한 예외 처리
            System.err.println("예외 발생: " + throwable.getMessage());
        }
    }
}