개발저장소
[Java] 예외 처리 본문
예외란?
프로그래밍 과정에서 발생한 오류 중에 개발자가 해결할 수 있는 오류를 예외(exception)이라고 한다.
그리고 이를 적절하게 조치하는 것을 예외 처리라고 한다.
예외와 에러의 차이점
예외(exception)와 에러(error)는 비슷하지만 다른 의미를 가진다.
연산, 숫자 포맷 오류 같은 상황에 따라 개발자가 해결할 수 있는 오류는 예외라고 한다.
그리고 JVM 자체에서 발생하는 오류 같은 개발자가 해결할 수 없는 오류를 에러라고 한다.
둘 다 Throwable 클래스를 상속하며 Exception은 일반 예외(checked exception)와 실행 예외(unchecked/runtime exception)로 나뉜다. 일반 예외는 컴파일 이전에 검사하며 실행 예외는 실행할 때 발생한다.
일반 예외는 InterruptedException, ClassNotFoundException, IOException 등이 존재하고, 실행 예외는 ArithmeticException, ClassCastException, ArrayIndexOutOfBoundsException 등이 있다.
1. 예외 처리
프로그램 실행 시 예외가 발생했을 때 처리하는 것. 프로그램이 종료되지 않고 계속 실행할 수 있도록 하는 것이 목적이다.
예외 처리 문법은 try, catch, finally 3가지 요소로 구성되어 있다.
- try: 블록 안에 예외가 발생할 수 있는 코드를 포함한다.
- catch: 예외가 발생했을 때 처리할 코드가 포함된다. 매개변수로 반드시 Java.lang.Throwable 클래스의 하위 타입으로 설정되어야 한다. 여러 개인 경우 맨 위부터 실행된다.
- finally: 예외가 발생하든 하지 않든 항상 실행되는 블록이다. 주로 리소스 해제나 공통 기능 코드가 포함된다. 생략 가능하다.
try {
// 예외 발생 가능 코드
} catch (예외1 클래스명 참조 변수명) {
// 예외가 발생했을 때 처리
} catch (예외2 클래스명 참조 변수명) {
// 예외가 발생했을 때 처리
} finally {
// 예외 발생 여부와 상관없이 무조건 실행
}
Try-with-resources
리소스를 자동으로 해제하는 예외 처리 방식이다.
try(리소스 자동 해제가 필요한 객체 생성) {
// 예외 발생 가능 코드
} catch (예외 클래스명 참조 변수명) {
// 해당 예외가 발생했을 때 처리하는 블록
} finally {
// 예외 발생 여부에 상관없이 무조건 실행하는 블록
}
try 구문의 소괄호에 자동으로 리소스를 반납해야 할 객체를 생성한다. 예외 처리 구문이 완료되면 try(){} 블록의 소괄호 안에서 생성된 객체 내부의 close() 메서드를 자동으로 호출하게 된다.
리소스를 자동으로 해제하는 객체는 AutoCloseable 인터페이스를 구현해야 한다.
2. 예외 전가
예외가 발생하였을 때, 호출한 지점으로 예외를 전가할 수도 있다. 예외를 전가하면 예외 처리의 의무를 호출한 메서드가 가지게 된다. 메서드 이름 뒤에 'throws 예외 클래스 이름' 형태로 사용할 수 있다.
예외를 전가하면 호출된 곳에서 한번에 예외를 처리할 수 있다는 장점이 있다.
3. 사용자 정의 예외 클래스
Exception을 상속해 일반 예외 클래스로 만들거나, RuntimeException을 상속해 실행 예외 클래스로 만드는 방법이 있다.
대표적으로 사용할 수 있는 메서드는 getMessage()와 printStackTrace() 가 있다.
'Programming Language > Java' 카테고리의 다른 글
| [Java] 스레드 - 2 (0) | 2024.05.14 |
|---|---|
| [Java] 스레드 - 1 (0) | 2024.05.13 |
| [Java] 이너 클래스와 이너 인터페이스 (0) | 2024.05.09 |
| [Java] 추상 클래스와 인터페이스 (0) | 2024.05.08 |
| [Java] 상속 (0) | 2024.05.03 |