[Java] Checked Exception과 Unchecked Exception

Java에서 예외는 프로그램 실행 중에 발생할 수 있는 오류 및 예외 상황을 처리하는 데 사용된다.

Java의 예외에는 Checked Exception과 Unchecked Exception 두 가지 예외로 구분이 되는데 오늘은 Checked Exception Unchecked Exception에 대해 공부해 보자.

 

 

https://marrrang.tistory.com/56

Checked Exception

Checked Exception은 아래와 같은 특징을 갖고 있다.

 

  • RuntimeException을 상속하지 않는 클래스
  • 컴파일 시점에 컴파일러에서 확인하는 예외
  • 반드시 에러 처리를 해야 하는 특징(try/catch or throw)을 가지고 있다. 

 

checked exception의 예시를 코드로 확인해 보자.

public class CheckedException {
    public static void main(String[] args) {
        try {
            File file = new File("example.txt");
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println("line = " + line);
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("An error occurred while reading the file: " + e.getMessage());
        }
    }
}

 

위 코드는 example.txt라는 파일을 읽는 코드인데 실제로 example.txt 라는 파일은 존재하지 않기 때문에 문제가 있는 코드다. 그래서 example.txt 파일을 읽으려고 하면 예외처리(FileNotFoundException)를 진행한다.

즉 catch 안의 코드를 실행한다.  아래는 실제 에러 메시지이다.

An error occurred while reading the file: example.txt (No such file or directory)

 

위의 예시에서 나온 예외인 FileNotFoundException 이외에도 다른 예외도 많이 존재한다.

  • IOException: 파일 또는 네트워크 연결에서 읽기 또는 쓰기와 같은 입력/출력 작업과 관련된 오류
  • SQLException: 데이터베이스 액세스 및 쿼리와 관련된 오류
  • ClassNotFoundException: 동적으로 클래스 로드와 관련된 오류
  • InterruptedException: 스레드 중단 및 동기화와 관련된 오류의 경우

 

Unchecked Exception

Unchecked Exception의 특징은 아래와 같다.

 

  • RuntimeException을 상속하는 클래스
  • 런타임 단계에서 확인 가능
  • 에러 처리를 강제하지 않는다.

 

Unchecked Exception은 checked exception과 다르게 컴파일 시 컴파일러에서 확인하지 않는 예외이다.

우리가 대표적으로 접할 수 있는 에러인 NullPointerException, ArrayIndexOutOfBoundsException 에러가 Unchecked Exception에 해당한다. 

 

 

Unchecked exception도 예시 코드로 확인해 보자.

public class UncheckedException {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        int index = 10;

        System.out.println("number = " + numbers[index]);
    }
}

위 코드는 길이가 3인, 즉 index가 2까지 밖에 존재하지 않는 배열의 10번째 index에 접근하려고 하는 코드이다.

당연히 아래와 같이 ArrayIndexOutOfBoundsException 에러가 발생한다.

 

 

위 예시 코드도 아래처럼 try ~ catch 문을 사용해 에러가 발생하는 지점에 예외처리를 해줄 수 있다.

public class UncheckedException {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        int index = 10;

        try {
            int number = numbers[index];
            System.out.println("number = " + number);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("An error occurred: " + e.getMessage());
            
            // An error occurred: Index 10 out of bounds for length 3
        }
    }
}

 

정리

간단하게 정리하면 Checked Exception은 RuntimeException을 상속하지 않은 클래스이며, 예외처리를 반드시 해줘야 하고, Unchecked Exception은 코드에 개발자가 예상치 못한 에러가 발생할 수 있기 때문에 예외처리를 강제하지 않는다.