본문 바로가기
Spring

Java - Checked and Unchecked Exception

by 오늘부터개발시작 2022. 8. 13.

 

 

 

 

 

출처 - https://howtodoinjava.com/

Java의 Exception은 크게 두가지로 나뉜다. 바로 Checked Exception과 Unchecked Exception이다. 먼저 Checked Exception에 대해서 알아보고 다음으로 Unchecked Exception에 대해서 알아보도록하겠다.

 

Checked Exception

Checked Exception은 쉽게 말해서 컴파일 타임에 잡히는 Exception이다. 예를 들면 FileInputStream이라는 클래스의 생성자는  만약 파일이 없을 경우에 FileNotFoundException을 발생시키는데 아래처럼 Exception을 처리해주는 코드를 넣어주지 않으면 컴파일에서

"java: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown"라는 에러가 나게 된다. 이게 바로 Checked Exception이다.

 

void fileInputStream() {
    File file = new File("not_existing_file.txt");
    FileInputStream stream = new FileInputStream(file);
}

 

Checked Exception을 처리하는 방법은 메소드에 throws 키워드를 사용하거나 

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

 

try catch 문을 사용해서 Exception을 Handling 해줘야한다.

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

    }
}

 

Java에서 주로 발생하는 Checked Exception은 IOException, SQLException, ParseException 등이 있다. 커스텀 Checked Exception으로 예외처리를 하고 싶다면 Exception을 상속해서 클래스를 생성해서 사용하면 된다. 

 

class IOException extends Exception {
    static final long serialVersionUID = 7818375828146090155L;

    /**
     * Constructs an {@code IOException} with {@code null}
     * as its error detail message.
     */
    public IOException() {
        super();
    }
}

 

 

 

 

 

Unchecked Exception

Checked Exception이 컴파일 타임에 잡히는 Exception이라고 한다면 Unchecked Exception은 Runtime Exception이라고 할 수 있다. 가장 간단한 예시로는 Integer를 0으로 나누면 ArithmeticException이 발생한다. 

 

Unchecked Exception은 예외 처리를 해주지 않아도 컴파일은 무사히 성공할 수 있다. 그런데 예외 처리를 해주지 않으면 예기치 못한 에러가 발생했을 때 프로그램이 망가질 수도 있으니 적절한 예외 처리를 잘 해야한다. Unchecked Exception의 가장 흔한 예시로는 NullPointerException, IlLegalArgumentException 등이 있다.

 

Java에서는 RuntimeException이라는 클래스가 모든 Unchecked Exception의 부모이고 이 클래스를 상속 받아서 커스텀한 예외 클래스를 생성해서 사용할 수 있다. 다음 예시는 404를 발생시키고 싶을 때 사용할 수 있는 Exception이다.

 

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {
    public NotFoundException(String message) {
        super(message);
    }
}

 

 

 

 

 

 

 

어떻게 사용해야 할까?

그렇다면 둘 중에 어떤 Exception을 사용해야 할지도 가이드가 필요하다. 오라클에서는 사용자가 예외 발생에 대응해서 처리할 수 있을 것 같으면 Chcked Exception을 사용하고 사용자가 예외 발생 시 어떤 것도 할 수 없다면 Unchecked Exception을 사용하라고 한다. 이 글로만은 잘 이해가 가지 않는데 예시를 들어보겠다.

 

만약 사용자가 파일을 첨부하는데 잘못된 확장자의 파일을 첨부하려고 하면 Exception이 발생된다. 이 때 사용자는 알맞은 확장자의 파일을 사용해서 예외가 발생해도 다시 처리할 수 있다. 이 때는 Checked Exception을 사용하면 된다.

 

반대로 사용자가 올바른 확장자의 파일을 첨부하고 정상적인 요청을 했는데 에러가 발생했다면 사용자가 예외 발생에 대한 어떤 처리도 할 수 없게 된다. 이 때는 Unchecked Exception을 사용하면 된다.