예외 vs 에러
예외
연산 오류, 숫자 포맷 오류 등과 같이 상황에 따라 개발자가 해결할 수 있는 오류
에러
자바 머신 자체에서 발생하는 오류로 개발자가 해결할 수 없는 오류
예외 처리
오류가 발생했을 때 차선책을 제시함으로써 오류를 피하는 과정
예외 클래스의 상속 구조
일반 예외 & 실행 예외
일반 예외
: 컴파일 전에 체크 가능 - Exception으로부터 상속
실행 예외
: 예외 처리를 하지 않아도 컴파일은 가능하나, 실행 중 예외가 발생하면 프로그램 종료 - RuntimeException으로부터 상속
예외 처리
try {
// 일반 예외, 실행 예외 발생 가능 코드
} catch (예외 클래스명 참조 변수명) {
// 예외가 발생했을 때의 처리
} finally {
// 예외 발생 여부와 관계없이 무조건 실행
}
다중 예외 처리
try {
// 일반 예외, 실행 예외 발생 가능 코드
} catch (예외 클래스명1 참조 변수명1) {
// 예외가 발생했을 때의 처리
} catch (예외 클래스명2 참조 변수명2) {
// 예외가 발생했을 때의 처리
} catch (예외 클래스명3 참조 변수명3) {
// 예외가 발생했을 때의 처리
} finally {
// 예외 발생 여부와 관계없이 무조건 실행
}
또는
try {
// 일반 예외, 실행 예외 발생 가능 코드
} catch (예외 타입 A | 예외 타입 B 참조 변수명) {
// 예외가 발생했을 때의 처리
} finally {
// 예외 발생 여부와 관계없이 무조건 실행
}
multicatch block에서의 주의사항
: 나열된 예외 클래스들이 부모-자식 관계가 있다면 오류가 발생함
리소스 자동 해제 예외 처리(try with resource)
- 예외 처리 구문이 완료된 후 리소스 객체의 close() 메서드를 자동으로 삽입
- AutoCloseable 인터페이스를 상속받은 클래스의 객체에 한해서만 사용 가능
public static void main(String[] args) {
try (
// 자원 생성 구문
InputStreamReader isr = new InputStreamReader(System.in);
// …
) {
isr.read();
System.out.println(3/0);
} catch (IOException | ArithmeticException ae) {
System.out.println("예외 발생");
} catch (Exception e) {
System.out.println("예측하지 못한 예외가 발생");
} finally {
// 자원 해제 구문(close() 메서드를 호출)을 생략
}
System.out.println("정상 종료");
}
throw
- 고의로 예외를 발생시킬 때 사용
- 프로그램 동작 중 개발자가 원하는 조건을 만족하지 않을 때 더 이상 코드가 진행하지 못하도록 예외를 발생시킬 때 사용
- 대표적으로 라이브러리를 만들 때 사용
throws
- 예외가 발생한 메서드를 호출한 곳으로 예외 객체를 넘기는 방법
'JAVA' 카테고리의 다른 글
대표적인 예외의 종류 (0) | 2023.04.02 |
---|---|
인터페이스 (0) | 2023.04.02 |
상속 (0) | 2023.04.02 |
접근지정자 - Abstract (0) | 2023.04.02 |
접근지정자 - Final (0) | 2023.04.02 |
댓글