체크 예외(Check), 언체크(Uncheck) 예외

2023. 3. 5. 18:39개발

반응형

김영한님의 강의를 보면서 무의식적으로만 알고 넘어가던 부분들에 대해 정리를 하려고 한다.
기본적인 예외의 구조는 다음과 같다.

보통의 경우 가장 많이 맞이하는  NullPointExcepiton의 경우 언체크 예외로 취급되며 컴파일시에 체크가 되지않아.. 어디서 언제 발생했는지 항상 문제가되며 잘 검증하고 체크하지 않는경우 언제 어디서든 찾아와서 반겨준다.

예외 FlowChart

 

기본적인 큰 틀의 경우 체크, 언체크 예외의 기준은 컴파일러가 해당 코드를 컴파일시 예외처리에 대해서 신경을 써서 알려주는지 아닌지 여부에 따른다.
체크 예외처리가 필요한 곳이 있는데 throw하지 않거나 try,catch 처리 하지 않는다면 컴파일시 해당 부분이 문제가 된다고 알려주기 때문에 컴파일러가 체크 해준다고 하여 체크예외! 라고 기억하면 좋을듯 같다.

위 내용을 요즘 핫한 ChatGpt에게도 물어보았다..!

ChatGpt..!

ChatGpt에게 확인 할 수 있는 코드 또한 같이 요청해 보았다..

아래는 체크 예외를 발생시키는 코드 예시입니다.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("file.txt"));
            String line = br.readLine();
            System.out.println(line);
        } catch (FileNotFoundException e) {
            System.out.println("파일이 존재하지 않습니다.");
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

위 코드에서는 FileReader 객체를 생성할 때 "file.txt" 파일이 존재하지 않는 경우 FileNotFoundException 예외가 발생합니다. 이 예외는 try-catch 블록으로 처리해주어야 합니다.

반면, 언체크 예외는 컴파일러가 예외 처리를 강제하지 않는 예외입니다. 따라서 예외 처리를 해주지 않아도 컴파일이 가능하며, 예외가 발생한 경우 프로그램이 강제로 종료됩니다. 대표적인 예시로는 NullPointerException, ArrayIndexOutOfBoundsException 등이 있습니다.

아래는 언체크 예외를 발생시키는 코드 예시입니다.

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length());
    }
}

위 코드에서는 String 변수 str이 null인 상태에서 str.length() 메소드를 호출하면 NullPointerException 예외가 발생합니다. 이 예외는 try-catch 블록으로 처리해주지 않아도 되지만, 예외 발생 시 프로그램이 강제로 종료됩니다.

 

그리고 관련되어서 필수적으로 예외처리가 필요한 경우가 아니라면 보통의 경우 언체크 예외로 처리가 되어야 맞고, 특정 라이브러리나 시스템에 종속되는 체크예외가 있는경우 문제가 된다고 설명하였다.

예외처리에 적용되는 2가지 기본 규칙은 아래와 같다.
1. 예외는 잡아서 처리하거나 던져야 한다.
2. 예외를 잡거나 던질 때 지정한 예외뿐만 아니라 그 예외의 자식들도 함께 처리된다.
예를 들어서 Exception 을 catch 로 잡으면 그 하위 예외들도 모두 잡을 수 있다.
예를 들어서 Exception 을 throws 로 던지면 그 하위 예외들도 모두 던질 수 있다.

만약 코드상에서 throw 처리를 할때 특정 예외처리만 하는게 아니라면.. 내가 원하는 대로 동작하지 않게 될 가능성이 높다
(SqlException만 처리하고 싶었지만, Excetpion전체에 대해 처리하게됨)

그리고 특정 시스템에 종속적인 예외처리 코드가 들어가게 되면 코드 전체를 수정해야하는 문제가 발생한다.
(SqlException의 경우 특정 JDBC에 종속적으로 진행되는데 JPA를 쓰게된다면 해당 에러가 아닌 다른에러를 던지게되므로 쓸모없는 코드가 된다. 이 경우에는 전체 프로젝트에 존재하는 해당 코드를 모두 찾아 제거야하는 경우가 발생해버린다.)

반응형