본문 바로가기

JAVA

Checked Exception 과 Unchecked Exception

Java에서 예외는 두 가지 주요 카테고리인 체크 예외와 언체크 예외로 나뉩니다.

체크 예외(Checked Exceptions)

체크 예외는 일반적으로 프로그램의 제어 범위를 벗어난 에러를 나타냅니다. 예를 들어, 코드가 읽으려는 파일이 존재하지 않는 경우, FileNotFoundException이라는 체크 예외가 발생합니다. Java는 컴파일 시점에서 체크 예외를 검증합니다. 이는 체크 예외를 발생시킬 수 있는 메소드를 작성할 때, throws 키워드를 사용해 예외를 선언하거나 try-catch 블록을 사용해 예외를 처리해야 한다는 것을 의미합니다.

다음은 체크 예외를 선언하는 예제입니다:

private static void checkedExceptionWithThrows() throws FileNotFoundException {
    File file = new File("not_existing_file.txt");
    FileInputStream stream = new FileInputStream(file);
}

그리고 다음은 try-catch 블록을 사용해 체크 예외를 처리하는 예제입니다

private static void checkedExceptionWithTryCatch() {
    File file = new File("not_existing_file.txt");
    try {
        FileInputStream stream = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

Exception 클래스는 체크 예외의 슈퍼클래스입니다. 이는 Exception 클래스를 확장함으로써 사용자 정의 체크 예외를 생성할 수 있다는 것을 의미합니다. Java에서 일반적인 체크 예외에는 IOException, SQLException, ParseException 등이 있습니다.

언체크 예외(Unchecked Exceptions)

반면, 언체크 예외는 일반적으로 프로그램 로직의 에러를 반영합니다. 예를 들어, 숫자를 0으로 나누려고 하면, ArithmeticException이 발생합니다. Java는 컴파일 시점에서 언체크 예외를 검증하지 않습니다. 이는 언체크 예외를 선언하거나 처리할 필요가 없지만, 적절히 처리되지 않으면 런타임에서 프로그램이 중단될 수 있음을 의미합니다.

다음은 언체크 예외의 예제입니다

private static void divideByZero() {
    int numerator = 1;
    int denominator = 0;
    int result = numerator / denominator;  // 런타임에 ArithmeticException이 발생할 것입니다
}

RuntimeException 클래스는 모든 언체크 예외의 슈퍼클래스이므로, RuntimeException 클래스를 확장하여 사용자 정의 언체크 예외를 만들 수 있습니다. Java에서 흔히 발생하는 언체크 예외에는 NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등이 있습니다.

체크 예외와 언체크 예외를 언제 사용해야 하는가

Oracle Java 문서에 따르면 클라이언트가 예외로부터 합리적으로 회복할 수 있는 경우, 체크 예외를 사용해야 합니다. 반면 클라이언트가 예외로부터 회복할 수 없는 경우, 언체크 예외를 사용해야 합니다. 예를 들어, 파일을 열기 전에 입력 파일 이름을 검증하고 이름이 유효하지 않으면 사용자 정의 체크 예외를 발생시킬 수 있습니다. 이렇게 하면 다른 입력 파일 이름을 받아들임으로써 시스템을 회복시킬 수 있습니다. 그러나 입력 파일 이름이 널 포인터이거나 빈 문자열인 경우(코드의 에러를 나타냄), 언체크 예외를 발생시켜야 합니다

반응형

'JAVA' 카테고리의 다른 글

자바 메모리 영역  (0) 2024.06.22
AOP 용어 정리  (0) 2023.04.16
try-with-resource  (0) 2022.07.14
sum 에 wrapper class를 쓰면?  (0) 2022.05.03
도메인 주도 설계 - 1부 동작하는 도메인 모델 만들기  (0) 2022.04.19