Java의 예외(Exception)와 오류(Error)는 모두 Throwable 클래스를 상속받으며, 프로그램 실행 중 발생할 수 있는 비정상적인 상황을 처리하기 위해 사용됩니다.
Throwable
├── Exception (예외)
│ ├── CheckedException (체크 예외)
│ └── UncheckedException (언체크 예외, RuntimeException)
└── Error (오류 - 시스템/VM 레벨)
| 예외 클래스 | 설명 |
|---|---|
| IOException | 입출력 실패 또는 인터럽트 (파일, 네트워크 등) |
| FileNotFoundException | 지정한 파일을 찾을 수 없음 |
| SQLException | DB 작업 도중 발생하는 예외 |
| ParseException | 날짜/시간 파싱 오류 |
| ClassNotFoundException | 클래스 로딩 실패 |
| InterruptedException | 스레드가 인터럽트됨 |
| NoSuchMethodException | 지정한 메서드가 존재하지 않음 |
| InstantiationException | 클래스 인스턴스화 실패 |
✔
try-catch또는throws선언 필요
| 예외 클래스 | 설명 |
|---|---|
| NullPointerException | null 객체 접근 시 발생 |
| IllegalArgumentException | 잘못된 매개변수 전달 시 |
| IndexOutOfBoundsException | 인덱스 초과 접근 시 |
| NumberFormatException | 숫자 형식이 잘못됐을 때 |
| ArithmeticException | 산술 오류 (예: 0으로 나누기) |
| IllegalStateException | 잘못된 상태에서 메서드 호출 시 |
| ClassCastException | 잘못된 타입 변환 시 |
| UnsupportedOperationException | 구현되지 않은 기능 호출 시 |
❗ 예외 처리 선택 가능 (
throws없이 사용 가능)
| 오류 클래스 | 설명 |
|---|---|
| OutOfMemoryError | JVM의 메모리 부족 |
| StackOverflowError | 스택 오버플로우 (무한 재귀 등) |
| VirtualMachineError | JVM 내부 문제 발생 |
| NoClassDefFoundError | 클래스 정의를 찾을 수 없음 |
| InternalError | JVM 내부 오류 |
| ThreadDeath | 스레드 강제 종료 |
❌ 대부분 try-catch로 처리하지 않고, JVM이 종료되거나 복구 불가 상황
| 항목 | Throwable | Exception | Error |
|---|---|---|---|
| 정의 | 예외/오류의 최상위 클래스 | 개발자가 처리 가능한 예외 | 시스템 수준의 치명적 오류 |
| 사용 목적 | 예외나 오류 포괄적 처리 | 로직 오류/외부 문제 처리 | 시스템/메모리 문제 대응 |
| 예외 처리 강제 여부 | - | Checked는 강제, Unchecked는 선택 | 거의 처리하지 않음 |
| 예시 | - | IOException, NullPointerException | OutOfMemoryError |
try {
FileReader reader = new FileReader("data.txt");
} catch (FileNotFoundException e) {
System.err.println("파일을 찾을 수 없습니다: " + e.getMessage());
}
자바에서 예외는 단순히 "오류"가 아니라 정상적인 흐름을 벗어난 상태를 통제하기 위한 메커니즘입니다. 예외를 잘 이해하고 적절히 처리하면, 프로그램의 안정성과 유지보수성이 훨씬 향상됩니다.