[기본 개념] 3 | (1.1) 예외처리 구조
1> 프로그램 오류
2> 예외 클래스의 계층구조
3> 예외처리하기 - try-catch문
4 try-catch문에서의 흐름
5 예외의 발생과 catch블럭
6 예외 발생시키기
7 메서드에 예외 선언하기
8 finally블럭
9 자동 자원 반환 - try-with-resources문
10 사용자 정의 예외 만들기
11 예외 되던지기(exception re-throwing)
12 연결된 예외(chained exception)
1. 프로그램 오류
프로그램 에러 또는 오류의 발생 시점에 따라 '컴파일 에러(compile-time error)'와 '런타임 에러(runtime error)'로 나눌 수 있는데, '컴파일 에러'는 컴파일할 때 발생하는 에러이고 '런타임 에러'는 프로그램의 실행 도중에 발생하는 에러이다.
이외에도 '논리적 에러(logical error)'가 있는데, 컴파일도 잘되고 실행도 잘되지만 의도한 것과 다르게 동작하는 것을 말한다.
ex) 창고의 재고가 음수가 되거나, 게임 프로그램에서 비행기가 총알을 맞아도 죽지 않는 경우
컴파일 에러 컴파일 시에 발생하는 에러
런타임 에러 실행 시에 발생하는 에러
논리적 에러 실행은 되지만, 의도와 다르게 동작하는 것
컴파일을 에러없이 마쳤다고 프로그램의 실행 시에도 에러가 발생하지 않는 것은 아니다. 런타임 에러 같은 실행 도중에 발생할 수 있는 잠재적인 오류까지 검사할 수 없기 때문이다.
런타임 에러를 방지하기 위해서는 프로그램의 실행도중 발생할 수 있는 모든 경우의 수를 고려하여 대비하는 것이 필요하다. 자바에서는 실행 시 발생할 수 있는 프로그램 오류를 '에러(error)'와 '예외(exception)', 두 가지로 구분하였다.
에러(error) 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
2. 예외 클래스의 계층구조
자바에서는 실행 시 발생할 수 있는 오류(Exception과 Error)를 클래스로 정의하였다. 모든 클래스의 조상은 Object클래스 이므로 Exception과 Error클래스 역시 Object클래스의 자손이다.
Object l |
||||
Throwable l |
||||
Exception l |
Error l |
|||
RuntimeException | . . . | IOException | . . . | OutOfMemoryError |
모든 예외의 최고 조상은 Exception클래스이며, 상속계층도를 Exception클래스부터 도식화하면 다음과 같다.
Exception l |
IOException |
ClassNotFoundException |
. . . |
RuntimeException l |
ArithmeticException |
ClassCastException |
NullPointerException |
. . . |
IndexOutOfBoundsExceprion |
1 Exception클래스와 그 자손들 (표의 윗부분)
2 RuntimeException클래스와 그 자손들 ( 부분)
RuntimeException클래스들 프로그래머의 실수로 발생하는 예외
ex) 배열의 범위 벗어남, 값이 null인 참조변수의 멤버호출, 형변환 잘못함, 정수 0으로 나누려고함
Exception클래스들 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
ex) 존재하지 않는 파일이름 입력, 잘못된 클래스이름 작성, 데이터 형식이 잘못됨
3. 예외처리하기 - try-catch문
예외처리(exception handling)의
정의 - 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
예외를 처리하기 위해서는 try-catch문을 사용하며 그 구조는 다음과 같다.
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
발생한 예외의 종류와 일치하는 단 한 개의 catch블럭만 수행된다. 발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.
예제/ExceptionEx1.java
public class ExceptionEx1 {
public static void main(String[] args) {
try {
try { } catch (Exception e) { }
} catch (Exception e) {
try { } catch (Exception e) { } // error. 변수 e가 중복선언 되었다.
} // try-catch문의 끝
try {
} catch (Exception e) {
} // try-catch문의 끝
} // main메서드의 끝
}
위의 예제는 아무 일도 하지 않는다. 이처럼 하나의 메서드 내에 여러 개의 try-catch문이 사용될 수 있으며, try블럭 또는 catch블럭에 또 다른 try-catch문이 포함될 수 있다.
catch블럭 내에 또 하나의 try-catch문이 포함된 경우, 같은 이름의 참조변수를 사용해서는 안된다.
예제/ExceptionEx3.java
public class ExceptionEx3 {
public static void main(String[] args) {
int number = 100;
int result = 0;
for(int i = 0; i < 10; i++) {
try {
result = number / (int)(Math.random() * 10);
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("0"); // ArithmeticException이 발생되면 실행되는 코드
} // try-catch의 끝
} // for의 끝
}
}
실행결과
33
16
14
0 <-- ArithmeticException이 발생해서 0이 출력됐다.
100
25
12
33
100
14
만약 예외처리를 하지 않았다면, 네 번째 줄까지만 출력되고 예외가 발생해서 프로그램이 비정상적으로 종료되었을 것이다.
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 3 | (1.3) Finally 블럭, Try-with-resources 문 (0) | 2021.11.24 |
---|---|
[기본 개념] 3 | (1.2) Try-catch 문, 예외 발생 (0) | 2021.11.24 |
[기본 개념] 2 | (8.1) 내부클래스, 익명클래스 (0) | 2021.11.21 |
[기본 개념] 2 | (7.3) 인터페이스, 디폴트 메서드 (0) | 2021.11.21 |
[기본 개념] 2 | (7.2) 인터페이스 다형성, 장점 (0) | 2021.11.20 |