[JAVA] Exception & Error
Java에서는 예외 처리를 관리하는 클래스로 Exception과 Error가 존재합니다.
두 클래스들은 모두 Throwable 클래스를 상속하지만, 그 목적과 처리 방법에서 중요한 차이가 있습니다.
Exception (예외)
Exception은 프로그램 실행 중에 발생할 수 있는 문제를 나타냅니다.
주로 애플리케이션에서 발생하는 문제를 다루며, 적절한 예외 처리를 통해 해결할 수 있는 경우입니다.
예를 들어, 파일을 읽는 중 파일이 없거나, 데이터베이스와 연결하는 과정에서 오류가 발생하는 상황이 이에 해당합니다.
Exception은 checked exception과 unchecked exception로 나눠집니다.
Checked exception
Java에서 Checked Exception은 컴파일러가 반드시 처리해야 한다고 요구하는 예외를 의미합니다.
이러한 예외는 주로 외부 시스템과의 상호작용이나 예측할 수 있는 특정 상황에서 발생할 수 있으며,
코드에서 이를 처리하지 않으면 컴파일 오류가 발생합니다.
Checked Exception은 RuntimeException을 제외한 Exception 클래스의 하위 클래스에 속하며,
반드시 예외 처리를 하도록 강제됩니다.
Checked Exception의 특징
- 컴파일 타임 예외 처리: Checked Exception은 컴파일 타임에 처리해야 하는 예외입니다. 즉, 코드에서 발생할 수 있는 예외를 처리하는 방법을 명시적으로 정의해야 하며, 이를 처리하지 않으면 컴파일 오류가 발생합니다.
- 명시적 처리 강제: Checked Exception을 메서드에서 발생시키는 경우, 해당 메서드는 반드시 예외를 처리하거나 throws 키워드를 사용하여 예외를 호출한 메서드로 던져야 합니다.
- 외부 시스템과의 상호작용에서 자주 발생: 파일 입출력, 데이터베이스 연결, 네트워크 통신 등 외부 시스템과의 상호작용에서 발생할 수 있는 예외들이 대부분 Checked Exception에 속합니다. 예를 들어, 파일이 존재하지 않거나, 네트워크 연결에 문제가 생겼을 때 발생하는 예외들입니다.
Unchecked exception
Java에서 Unchecked Exception은 RuntimeException을 상속받는 예외들을 의미합니다.
이러한 예외는 컴파일 타임에 처리할 필요가 없으며, 프로그램이 실행되는 도중에 발생합니다.
대부분 프로그래밍 오류나 잘못된 로직에서 발생하는 예외로, 예외 처리에 대한 강제성이 없습니다.
즉, 개발자가 명시적으로 처리하지 않아도 컴파일 오류가 발생하지 않으며,
예외가 발생하면 프로그램은 런타임에 감지하게 됩니다.
Unchecked Exception의 특징
- 컴파일 타임에 처리하지 않아도 됨: Unchecked Exception은 컴파일 타임에 예외 처리를 강제하지 않습니다. 예를 들어, NullPointerException, ArrayIndexOutOfBoundsException 같은 예외는 처리하지 않아도 컴파일 오류가 발생하지 않습니다.
- 런타임 예외: Unchecked Exception은 주로 프로그램의 실행 중에 발생하며, 개발자의 실수나 논리 오류에서 기인하는 경우가 많습니다.
- 상속 계층: Unchecked Exception은 RuntimeException을 상속한 예외들입니다. RuntimeException 클래스는 Exception 클래스의 하위 클래스이지만, Checked Exception과는 달리 예외 처리를 강제하지 않습니다.
- 명시적 예외 처리 불필요: Unchecked Exception은 예외를 처리하기 위해 try-catch 블록을 사용하거나, throws로 던지지 않아도 됩니다. 하지만 예외를 적절하게 처리하지 않으면 프로그램이 예기치 않게 종료될 수 있습니다.
Unchecked Exception과 Checked Exception의 차이점
항목 | Checked Exception | Unchecked Exception |
정의 | 예측 가능한 문제로 발생하는 예외. | 잘못된 로직에서 발생하는 예외. |
상속 계층 | Throwable → Exception → CheckedException | Throwable → Exception → RuntimeException |
예외 처리 강제 여부 | 예외 처리가 강제됨. 처리하지 않으면 컴파일 오류 발생. | 예외 처리가 강제되지 않음. 개발자가 선택적으로 처리. |
발생 시점 | 컴파일 타임에 예외가 발생할 가능성을 확인해야 함. | 런타임에 예외가 발생하며, 코드 실행 중에 발생할 수 있음. |
예시 | IOException, SQLException, FileNotFoundException | NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException |
예외 처리 방식 | try-catch 블록으로 처리하거나 메서드에 throws 선언하여 호출한 메서드로 던짐. | 예외를 처리할 필요가 없으며, 필요시 try-catch 블록으로 처리하거나 던질 수 있음. |
롤백 | 롤백되지 않음 | 롤백 됨 |
Error (에러)
Error는 JVM에서 발생하는 심각한 문제를 나타냅니다.
일반적으로 Error는 시스템 수준의 문제로, 보통 코드로 이를 처리할 수 없습니다.
예를 들어, 메모리 부족이나 스택 오버플로우와 같은 문제는 Error로 분류됩니다.
이러한 오류는 애플리케이션의 실행을 계속할 수 없게 만들며, 발생 시 보통 애플리케이션을 종료시킵니다.
Error는 JVM이나 시스템 내부에서 발생하는 문제로, 개발자가 이를 수정하는 것은 불가능합니다.
예시
- OutOfMemoryError: JVM이 사용할 수 있는 메모리가 부족한 경우 발생.
- StackOverflowError: 메서드 호출이 너무 깊어져서 스택 공간이 부족한 경우 발생.
- VirtualMachineError: JVM 자체에서 발생하는 오류.
Exception과 Error의 차이점
항목 | Exception | Error |
정의 | 애플리케이션에서 처리 가능한 문제 | 시스템 수준에서 발생하는 심각한 오류 |
처리 가능 여부 | 애플리케이션에서 처리 가능 (예외 처리 코드 작성 가능) | 애플리케이션에서 처리 불가능 (주로 JVM 문제) |
예시 | IOException, SQLException, RuntimeException | OutOfMemoryError, StackOverflowError |
용도 | 프로그램의 로직 오류나 외부 시스템과의 상호작용 오류 처리 | 시스템 오류, 메모리 부족, 스택 오버플로우 처리 |
상속 계층 | Throwable → Exception → CheckedException / RuntimeException | Throwable → Error |