자바에서 예외는 크게 Error 와 Exception 로 나눌 수 있다.
자바에서 모든 예외는 Throwable 클래스로부터 파생된다.
Throwable 클래스로부터 Error와 Exception으로 나뉘게 되며, Exception은 다시 기타 예외들과 RuntimeException으로 나뉜다.
Error
Error는 치명적인 오류가 발생하는 경우이다. 여기서 '치명적이다' 라는 것은 오류가 복구 불가능하여 별다른 처리를 할 수 없는 상태이다. 따라서 Error는 예외처리 대상이 아니다.
우리가 흔히 접하는 Error에는 대표적으로 OutOfMemoryError, StackOverflowError 등이 있다.
- OutOfMemoryError : 메모리를 초과하는 경우 발생하는 에러
- StackOverflowError : 스택 오버플로우가 생기는 경우 발생(재귀를 호출하는 횟수가 많은 경우)
Exception
Exception은 Error에 비해 비교적 덜 치명적인 오류이다. 따라서 Exception은 수습이 가능하므로 예외 처리가 가능하다. try-catch문이나 throws를 이용하여 예외를 처리할 수 있다.
Exception은 Checked Exception과 Unchecked Exception으로 분류할 수 있다.
▶ Checked Exception
컴파일 시, 예외 처리가 필수인 Exception이다. 이 예외들은 컴파일 시 예측할 수 있어서 회복이
가능하므로 반드시 예외 처리를 해주어야 한다.
Exception 중에서 RuntimeException과 하위 예외 클래스들이 Checked Exception에 해당한다.
▶ Unchecked Exception
예외 처리를 반드시 해야할 필요는 없는 Exception이다. RuntimeException를 상속받지 않은
기타 Exception들이 여기에 해당한다.
예외 처리
Checked Exception은 컴파일 시 예외 처리를 반드시 해줘야 한다. 이 때 예외를 처리하는 방법에는 try-catch문을 사용하는 경우와 throws를 사용하여 다른 메서드한테 예외 처리를 넘기는 경우가 있다.
1. try - catch 문
예외 발생 가능성이 있는 코드를 try-catch문으로 감싸서 예외 처리를 하는 방법이다.
try{
// 예외가 발생할 수 있는 코드
}
catch(Exception e){
// 예외를 처리하는 코드
}
finally{
// 무조건 실행되는 코드
}
예외가 발생할 수 있는 코드를 try문으로 감싸고, 만약 해당 코드에서 예외가 발생할 경우 catch문으로 이동하여 예외 처리를 한다.
catch문에서는 예외 발생 시 어떻게 처리할 것인지 코드를 작성한다. 어떤 예외가 발생했는지 해당 예외 객체를 인자로 전달한다. 이 때의 인자는 예외 객체를 가리키므로 참조 변수이다.
finally문은 예외 발생 여부와 관계 없이 무조건 실행된다. 자원 반납과 같은 일을 처리할 때 finally문에 넣는 것이 좋다.
2. 예외 처리 떠넘기기
try-catch문에서는 예외가 발생한 메서드에서 예외를 직접 처리하였다. 하지만 예외가 발생한 메서드가 직접 예외 처리를 하지 않고 자신을 호출한 상위 메서드에게 처리를 넘길 수가 있는데, 이때 사용하는 방법이 throws를 이용한 방법이다.
예외 처리 떠넘기기는 메서드명 옆에 throws 키워드와 함께 처리할 예외 클래스를 명시한다.
public void method() throws Exception {
// 이 메서드에서 예외가 발생하면
// method()를 호출한 메서드에게 예외 처리를 떠넘긴다.
}
아래 코드를 보면, method03() 에서 배열의 범위를 벗어난 인덱스로 접근했기 때문에ArrayIndexOutOfBoundsException이 발생한다.
그러면 method03()은 이 예외 처리를 자신을 호출한 method02()에게 떠넘기고, method02()는 다시 자신을 호출한 method01()에 책임을 떠넘긴다. 따라서 최종적으로는 method01()에서 예외를 처리하도록 한다.
public class Main {
public static void main(String[] args) {
method01();
}
public static void method03() throws ArrayIndexOutOfBoundsException {
int[] arr = { 0, 1, 2, 3, 4 };
System.out.println(arr[5]); // 인덱스를 벗어남
}
public static void method02() throws ArrayIndexOutOfBoundsException {
method03();
}
public static void method01() throws ArrayIndexOutOfBoundsException {
method02();
}
}
'JAVA' 카테고리의 다른 글
[java] 스레드(thread) (0) | 2021.04.15 |
---|---|
[java] HashMap, TreeMap, LinkedHashMap (0) | 2021.04.14 |
[java] String, StringBuffer, StringBuilder (0) | 2021.04.02 |
[java] ArrayList, LinkedList, Vector (0) | 2021.04.01 |