본문 바로가기
Java

Exception 관련 클래스의 계층 구조 (Unchecked Exception/Checked Exception)

by Kloong 2022. 3. 31.

1. Exception class와 Error class의 계층 구조

Exception class와 Error class의 계층 구조는 다음과 같다.

두 클래스 모두 Throwable class를 상속받았다.

Error가 발생하면 프로그램의 비정상 종료를 막을 수 없다. 하지만 Exception은 예외 처리를 통해 프로그램의 비정상 종료를 막을 수 있다.

2. RuntimeException class

Exception class의 자식 클래스는 크게 RuntimeException과 나머지 클래스로 구분할 수 있다.

RuntimeException class와 그 자식 클래스들은 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들이다. 배열의 범위를 벗어난다던가(ArrayIndexOutOfBoundsException), 값이 null인 참조변수의 멤버를 호출하려 했다던가(NullPointerException) 하는 경우에 발생한다.

RuntimeException 클래스 외의 나머지 Exception 클래스의 자식 클래스들은 주로 외부의 영향(프로그램 사용자의 동작 등)으로 발생할 수 있는 예외에 대한 클래스이다. 예를 들어 존재하지 않는 파일 이름을 입력했다던가(FileNotFoundException),  입력한 데이터 형식이 잘못되었다던가(DataFormatException) 하는 경우에 발생하는 예외들이다.

3.  Unchecked Exception/Checked Exception

class Main
{
    public static void main(String[] args)
    {
        throw new IOException(); //컴파일 에러 발생
    }
}

IOException같이 RuntimeException을 제외한 Exception 클래스의 자식 클래스 예외를 핸들링 하지 않는 경우 컴파일 에러가 발생한다.

 

class Main
{
    public static void main(String[] args)
    {
    	throw new RuntimeException(); //컴파일 성공
    }
}

하지만 RuntimeException의 경우에는 핸들링하지 않아도 정상적으로 컴파일된다. 물론 위 코드를 빌드 후 실행시키면, RuntimeException이 핸들링 되지 않았기 때문에 프로그램이 비정상종료된다.

왜 두 코드 모두 Exception이 발생할 수 있는 코드(여기선 고의로 던졌기 때문에 반드시 발생하긴 하지만)를 가지고 있음에도 컴파일 성공 여부가 달라질까?

 

이는 RuntimeException과 그 자식 클래스들의 특징에 있다. RuntimeException은 프로그래머의 실수에 의해서 발생될 수 있는 예외이기 때문에, RuntimeException 클래스와 모든 자식 클래스에 핸들링을 강제한다면 단순한 배열 접근 코드에도 throw-catch 문을 사용해야 할 것이다. 따라서 컴파일러는 RuntimeException이 발생할 수 있는 코드에 대해서 예외처리를 강제하지 않는다.

//RuntimeException 핸들링이 강제되는 경우 벌어지는 끔찍한 일
class Main
{
    public static void main(String[] args)
    {
    	try {
            int[] arr = new int[10];
            arr[0] = 1;
            System.out.println(arr[0]);
        }
        catch (ArrayIndexOutOfBoundsException ae) {
            //예외 처리 코드
        }
    }
}

이런 식으로 아주 단순한 배열을 사용하는 코드에도 ArrayIndexOutOfBoundsException이 발생할 가능성이 존재하기 때문에, RuntimeException 핸들링이 강제된다면 위와 같이 코딩을 해야 할 것이다. 상상만으로도 아주 끔찍하다.

컴파일러가 예외처리를 확인하지 않는 RuntimeException class와 그 자식 클래스들은 'unchecked exception'이라고 하고, 컴파일러가 예외처리를 확인(강제)하는 그 외의 Exception 클래스들은 'checked exception'이라고 한다.

'Java' 카테고리의 다른 글

[Java] Stream  (0) 2022.10.13
[Java] 람다식(Lambda Expression)  (0) 2022.10.12
변수의 초기화  (0) 2022.01.20
[소소한 정보] this와 this()  (0) 2022.01.20
[소소한 정보] 가변 인자 (Variable arguments)  (0) 2022.01.20

댓글