[Java] checked exception VS. unchecked exception

Yoon Uk·2023년 7월 17일
0

언어 - Java

목록 보기
5/5
post-thumbnail

자바에서는 예외(Exception)를 체크 예외(Checked Exception)언체크 예외(Unchecked Exception)로 나눌 수 있습니다.

체크 예외(Checked Exception)

체크 예외는 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들입니다.

체크 예외는 컴파일러가 예외 처리를 확인하며, 개발자가 반드시 예외 처리를 해야하는 특징을 가지고 있습니다.

예외 처리 방법으로는 try-catch문을 사용하여 예외를 처리하거나, throws 키워드를 사용하여 예외를 던져 상위 호출자에게 처리를 넘길 수 있습니다.

대표적인 체크 예외로는 IOException, FileNotFoundException, SQLException 등이 있습니다.

  • throws를 사용한 예시
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을 상속받아 커스텀 체크 예외를 만드는 예시
public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }
}

언체크 예외(Unchecked Exception)

언체크 예외는 RuntimeException의 하위 클래스들을 의미합니다.

언체크 예외는 컴파일러가 예외 처리를 확인하지 않으며, 개발자가 예외 처리를 강제하지 않습니다.

주로 개발자의 실수로 발생하는 예외들이며, 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.

예외 처리 방법은 선택적이며, 필요에 따라 예외를 처리할 수 있습니다.

대표적인 언체크 예외로는 NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등이 있습니다.

예외 커스텀하기

프로젝트를 하다보면 커스텀 예외를 만들어서 사용할 때가 있습니다.
이 땐 매번 예외 처리를 해주지 않아도 되는 언체크 예외(Unchecked Exception)를 상속받아 예외를 커스텀하는 경우가 많습니다.

아래는 DB에서 Member를 조회하는 예시입니다.

  • RuntimeException을 상속받은 BusinessException
public class BusinessException extends RuntimeException{

    private ErrorCode errorCode;

    public BusinessException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }
}
  • BusinessException을 상속받은 EntityNotFoundException
public class EntityNotFoundException extends BusinessException {

    public EntityNotFoundException(ErrorCode errorCode) {
        super(errorCode);
    }

}
  • memberId로 Member를 조회할 때 해당 Member가 없는 경우
public Member findMemberByMemberId(Long memberId) {
    return memberRepository.findById(memberId)
            .orElseThrow(() -> new EntityNotFoundException(ErrorCode.MEMBER_NOT_EXISTS));
}

하지만 Oracle의 Java Tutorials에서는 개발자가 언체크 예외(Unchecked Exception)를 사용하면 해당 예외를 처리하는 코드를 작성하지 않아 편할 수 있지만 해당 예외를 처리하는 데 명료성을 떨어트릴 수 있다고 경고하고 있습니다.

Oracle에서 권고하는 최종 지침은 다음과 같습니다.

If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception.


클라이언트가 예외에서 복구할 것으로 합리적으로 예상할 수 있는 경우 확인된 예외(Checked Exception)로 만드십시오.
클라이언트가 예외에서 복구하기 위해 아무 것도 할 수 없는 경우 확인되지 않은 예외(Unchecked Exception) 로 만드십시오.

참고

https://www.baeldung.com/java-checked-unchecked-exceptions
https://www.learnpick.in/prime/documents/notes/details/4158/exception-handling-in-java

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

항상 좋은 글 감사합니다.

1개의 답글