[Java] 예외 처리(exception handling)
by Frinee1. 프로그램 오류
- 프로그램 오류(error): 프로그램 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우를 말함.
- 에러의 종류
- 컴파일 에러(compile error): 컴파일 시 발생하는 에러
- 런타임 에러(runtime error): 실행 시 발생하는 에러
- 논리적 에러(logical error): 실행은 되지만, 의도와 다르게 동작하는 것
- 프로그램은 런타임 에러를 방지하기 위해 대비를 하는데 자바에서는 프로그램 오류를 에러(error)와 예외(exception)으로 구분함.
- 에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외(exception): 프로그램 코드에 의해서 수습될 수 있은 다소 미약한 오류
2. 예외 클래스의 계층 구조
- 예외 클래스는 다음과 같이 두 그룹으로 나뉠 수 있다.
- Exception클래스: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
- RuntimeException클래스: 프로그래머의 실수로 발생하는 예외
- IOException: 입출력 작업 중 발생하는 예외 (파일 읽기/쓰기, 네트워크 입출력 등)
- ClassNotFoundException: 클래스 파일을 찾을 수 없을 때 발생
- RuntimeException: 실행 중(Runtime)에 발생하는 예외들의 부모 클래스
- ArithmeticException: 수학적 연산 오류가 발생할 때 발생
- ClassCastException: 잘못된 형변환을 시도할 때 발생
- NullPointerException: null 값을 참조하려고 할 때 발생
- IndexOutOfBoundsException: 배열이나 리스트 등의 인덱스가 범위를 벗어날 때 발생
3. 예외 처리: try-catch
- 예외처리(Exception Handling)
- 정의: 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
- 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
- 예외를 처리하기 위해서는 try-catch문을 활용하며 그 구조는 다음과 같다
try {
// 예외가 발생할 가능성이 있는 문장을 넣는다.
} catch(Exception1 e1){
// Exception1이 발생한 경우, 이를 처리하기 위한 문장을 넣는다.
} catch(Exception2 e2){
// Exception2가 발생한 경우, 이를 처리하기 위한 문장을 적는다.
}
- 하나의 try블록 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch블록이 올 수 있으며, 이 중 발생한 예외의 종류와 일치하는 단 한 개의 catch블록만 수행
- catch블록 안에 또 다른 try-catch블록을 사용할 경우, 변수명을 다르게 해줘야 함.
3.1. try-catch문에서의 흐름
- try블록 내에서 예외가 발생한 경우,
- 발생한 예외와 일치하는 catch블록이 있는지 확인
- 일치하는 catch블록을 찾게 되면, 그 catch블록 내의 문장들을 수 행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블록을 찾지 못하면, 예외는 처리되지 못한다.
- try블록 내에서 예외가 발생하지 않은 경우,
- catch블록을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
3.2. printStackTrace()와 getMessage()
- 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨있음.
- printStackTrace(): 예외발생 당시의 호출(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
- getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
4. 예외 처리: 메서드에 예외 선언하기
- 메서드에 예외를 선언하려면, 메서드의 선언부에 키워드 throw를 사용해서 메서드 내에 발생할 수 있는 예외를 적어주면 됨.
void method() throws Exception1, Exception2, ... ExceptionN {
// 메서드 내용
}
- 이로 인해 메서드 내에서 발생할 수 있는 예외를 메서드의 선언부에 명시하여 견고한 프로그램 코드를 작성할 수 있도록 도와줌.
5. finally 블럭
- finally 블럭은 예외 발생여부와 상관없이 실행되어야 할 코드를 포함시킬 목적으로 사용
- try-catch문의 끝에 선택적으로 덧붙여 사용할 수 있으며, try-catch-finally의 순서로 구성됨.
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// 예외처리를 위한 문장을 적는다.
} finally {
// 예외의 발생 여부에 관계없이 항상 수행되어야 하는 문장들을 넣는다.
// finally블럭은 try-catch문의 맨 마지막에 위치해야 한다.
}
'Backend > Java' 카테고리의 다른 글
[Java] Generics, Enum, Annotation (1) | 2025.02.18 |
---|---|
[Java] 컬렉션 프레임워크(Collections Framework) (1) | 2025.02.09 |
[Java] 객체지향 프로그래밍 (OOP) (0) | 2025.01.27 |
자바 기본 구조와 기본 문법 (0) | 2025.01.18 |
블로그의 정보
프리니의 코드저장소
Frinee