자바에서는 예외(Exception)를 체크 예외(Checked Exception)
와 언체크 예외(Unchecked Exception)
로 나눌 수 있습니다.
체크 예외는 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들입니다.
체크 예외는 컴파일러가 예외 처리를 확인하며, 개발자가 반드시 예외 처리를 해야하는 특징
을 가지고 있습니다.
예외 처리 방법으로는 try-catch문을 사용하여 예외를 처리하거나, throws 키워드를 사용하여 예외를 던져 상위 호출자에게 처리를 넘길 수 있습니다.
대표적인 체크 예외로는 IOException, FileNotFoundException, SQLException 등이 있습니다.
private static void checkedExceptionWithThrows() throws FileNotFoundException {
File file = new File("not_existing_file.txt");
FileInputStream stream = new FileInputStream(file);
}
private static void checkedExceptionWithTryCatch() {
File file = new File("not_existing_file.txt");
try {
FileInputStream stream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public class IncorrectFileNameException extends Exception {
public IncorrectFileNameException(String errorMessage) {
super(errorMessage);
}
}
언체크 예외는 RuntimeException의 하위 클래스들을 의미합니다.
언체크 예외는 컴파일러가 예외 처리를 확인하지 않으며, 개발자가 예외 처리를 강제하지 않습니다.
주로 개발자의 실수로 발생하는 예외들이며, 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.
예외 처리 방법은 선택적
이며, 필요에 따라 예외를 처리
할 수 있습니다.
대표적인 언체크 예외로는 NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등이 있습니다.
프로젝트를 하다보면 커스텀 예외를 만들어서 사용할 때가 있습니다.
이 땐 매번 예외 처리를 해주지 않아도 되는 언체크 예외(Unchecked Exception)를 상속받아 예외를 커스텀하는 경우가 많습니다.
아래는 DB에서 Member를 조회하는 예시입니다.
public class BusinessException extends RuntimeException{
private ErrorCode errorCode;
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}
public class EntityNotFoundException extends BusinessException {
public EntityNotFoundException(ErrorCode errorCode) {
super(errorCode);
}
}
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
항상 좋은 글 감사합니다.