예외와 에러
✒️ 2025-05-29 17:15 내용 수정
- 프로그램 작성 시 문법에 맞지 않는 코드를 작성하고 컴파일하거나, 맞게 작성해도 실행 시 오류가 발생할 수 있다.
Error(에러)
프로그램에서 처리할 수 없는 치명적인 시스템적 문제
- 개발자가 미리 예측해서 처리할 수 없고 에러가 생기지 않도록 방지할 수 밖에 없다.
- 복구가 불가능한 시스템 적으로 치명적인 문제다.
- 시스템 자원 고갈, stack overflow, 메모리 부족 등의 상황에서 발생한다.
- 이미 발생한 오류는 처리하기 어렵다.
- 문법 상의 문제로도 생길 수 있다.
| Error 종류 | 설명 |
|---|---|
| OutOfMemoryError | 프로그램 실행 중 메모리 부족 |
| IOError | 입출력 에러 |
| StackOverFlowError | 가용 메모리 부족 |
Exception(예외)
문법적으로는 문제가 없는 것처럼 보이지만 실제 운영에 생기는 문제
-
개발자가 미리 예측해서 예외 상황을 처리하도록 할 수 있다.
-
예외 처리를 하면 프로그램을 바로 종료 시키지 않고 정상 실행하도록 만들 수 있다.
-
Exception 클래스의 구조 (https://www.tcpschool.com/java/java_exception_class)

예외의 종류
| 구분 | 체크 예외(외부 연결) | 비체크 예외(내부) |
|---|---|---|
| 확인 시점 | 컴파일 단계에서 확인 (처리가 없다면 컴파일 오류 발생 가능) |
실행(Runtime) 단계에서 확인 (컴파일 시점에 검사 X) |
| 처리 여부 |
문법적으로 예외 처리를 강제함 반드시 처리해야 하는 치명적인 예외 상황 |
문법적으로 강제하지 않음 개발자의 판단에 의해 처리되는 주로 치명적이지 않은 예외 상황 |
| 예외 클래스 | RuntimeException을 제외한 Exception 클래스의 자식클래스 | RuntimeException의 자식 클래스 모두 포함 |
| IOException, SQLException 등 | NullPointerException, IndexOutOfBoundsException 등 |
1) checked exception
- Java 소스를 컴파일하는 과정에서 검사한다.
- Java Compiler가 컴파일 시(소스 코드->바이트 코드)
- 컴파일 단계에서 확인하며, 반드시 처리해야 하는 치명적인 예외 상황이다.
try-catch블록이나 메서드 선언부에throws키워드를 반드시 사용해야 한다.
Exception을 상속하는 클래스 중RuntimeException을 제외한 클래스가 속한다.- 외부 자원(File, XML, Network DB 등)과 관련된 동작을 처리할 때 주로 발생한다.
| 예외 클래스 | 설명 |
|---|---|
IOException |
입출력 작업 중 발생하는 예외 |
SQLException |
데이터베이스 접근 중 발생하는 예외 |
ClassNotFoundException |
클래스를 찾을 수 없을 때 발생 |
InterruptedException |
스레드가 인터럽트될 때 발생 |
FileNotFoundException |
파일을 찾을 수 없을 때 발생 |
SAXException |
XML 문서 구조 오류 |
ParserConfigurationException |
XML 파서 설정 오류 |
2) unchecked exception
- 컴파일 과정에서 검사하지 않으므로, 사용자의 경험이나 테스트로 찾아야 한다.
- 실행 단계(Runtime) 때 발생 시 프로그램이 비정상 종료될 수 있다.
- 개발자의 판단 하에 처리할 수 있으며, 예외 처리가 강제 되지 않는다.
try-catch로도 예외 처리를 할 수 있으나, 입력 유효성 검사나null체크 등으로 예방하는 것이 좋다.
RuntimeException을 상속한다.
| 예외 클래스 | 설명 |
|---|---|
NullPointerException |
null 객체를 참조할 때 발생 |
ArrayIndexOutOfBoundsException |
배열의 잘못된 인덱스를 접근할 때 발생 |
ArithmeticException |
산술 연산 중 오류가 발생할 때 발생 |
ClassCastException |
잘못된 형변환 시 발생 |
IllegalArgumentException |
메서드에 부적절한 인자를 전달할 때 발생 |
NumberFormatException |
문자열을 숫자로 변환 실패 시 발생 |