Java의 checked 예외

Java는 이전 강의에서 본 어디서 어떤 예외가 발생했는지 알기 어려운 상황을 막는 방법이 있음

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으로 컴파일러가 확인하는 기능을 무시함

0건의 항목