Java의 checked 예외

Java는 이전 강의에서 본 어디서 어떤 예외가 발생했는지 알기 어려운 상황을 막는 방법이 있음
- 예외 처리를 제대로 하지 못하는 이유 참고
- Java 예외는 2종류
- Java에 있는 checked 예외

unchecked exception

unchecked 예외는 모두 빠짐없이 RuntimeException을 상속함
- 콜스택을 조사해서 어떤 예외가 어디에서 발생했는지 확인해야 함
checked exception

컴파일러가 check 하는 예외
오류를 방지하는 법
- 예외를 던지는 함수 안에서
catch블록으로 예외를 처리하기 - 이 메서드가 예외를 던진다는 것을 메서드 시그니처에 표기
- 대신 이 메서드의 호출자가 다시 위 2가지 방법 중 하나를 수행하기

Exception 클래스는 checked exception
RuntimeException을 상속하지 않음

checked exception이 발생하는 메서드에서 예외를 처리하지 않으면 위 슬라이드처럼 메서드 시그니처에 표기해야 함

findUser() 메서드가 checked exception을 던지기 때문에 호출자인 main() 함수에서 try 블록으로 예외 처리
- 또는
main()함수에서도 이 예외를 던진다는 것을 표기하면 컴파일 오류 방지
public static void main(String[] args) throws UserNotFoundException {
User user = null;
user = db.findUser("pope"); // 예외가 발생하면 JVM에 전달됨
}throws 절

checked exception을 던지는 메서드는 내부에서 예외를 처리하지 않으려면 throws 절로 예외를 던짐을 메서드 시그니처에 명시해야 함

checked exception인 UserNotFoundException을 던지는 findUser() 메서드
findUser() 메서드 내부에서 예외 처리를 하지 않고 시그니처에 throws 절을 표기하지 않아서 컴파일 오류가 발생

컴파일 오류 메시지에 checked exception을 처리하거나 throws 절로 명시하라고 함

만약 호출자인 main() 함수에서 처리하지 않고 싶다면?

호출자에서 똑같이 checked exception에 대한 규칙이 적용됨
public static void main(String[] args) {
User user = null;
try {
user = db.findUser("pope"); // 예외 발생 가능
} catch (UserNotFoundException e) {
e.printStackTrace(); // 로그 남기기
throw e; // 예외를 다시 던짐
}
}참고로 catch에서 처리하는데 또 다시 예외를 던지면?
throws절이 필요함- 이건 처리한게 아니라 그냥 다시 던지는 개념이라 컴파일러에서 오류 냄
public static void main(String[] args) {
User user = null;
try {
user = db.findUser("pope");
} catch (UserNotFoundException e) {
e.printStackTrace(); // 로그 남기기
System.out.println("User not found: " + e.getMessage());
}
}이렇게 완전히 처리하거나
public static void main(String[] args) throws UserNotFoundException {
User user = null;
try {
user = db.findUser("pope");
} catch (UserNotFoundException e) {
e.printStackTrace();
throw e;
}
}다시 던지려면 메서드 시그니처에 throws 절 표기
실무적으로 checked, unchecked 구분하기

Exception 상속하면서 RuntimeException을 상속하지 않으면?
- checked
RuntimeException 상속하면?
- unchecked

RuntimeException 클래스는 Exception 클래스를 상속받아 checked exception으로 컴파일러가 확인하는 기능을 무시함