JAVA 예외(Exception) 정복하기

1 분 소요

자바에서 예외(Exception)는 프로그램의 실행 도중에 발생할 수 있는 비정상적인 상황을 말한다.

예외는 일반적으로 프로그램이 실행 중에 예상치 못한 오류 상황이나 예외적인 조건에 직면했을때 발생한다.

예외가 발생하면 프로그램이 종료될 수 있지만, 예외 처리를 통해 실행 상태를 유지하고 적절한 조치를 취할 수 있다.

💡 예외의 종류

  1. 일반 예외 (Exception)
    컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말한다.
    IOException 와 같은 파일 조작시 발생하는 예외가 여기에 속한다.

  2. 실행 예외 (RuntimeException)
    컴파일러가 예외 처리 코드 여부를 검사하지 않은 예외를 말한다.
    NullPointException 과 같은 런타임시 발생하는 예외가 여기에 속한다.

💡 예외의 흐름

예외가 발생하면 해당 예외 클래스의 객체가 생성되고 이 객체는 호출 스택을 따라 메서드들을 거슬러 올라가면서 예외를 처리할 수 있는 try-catch 블록을 찾는다. 만약 호출 스택 맨 위 main() 까지 예외를 처리 할 수 없는 블록이 없다면 프로그램은 비정상 종료되고, 예외에 대한 정보가 출력된다.

  1. 예외 발생
    프로그램이 실행 중에 어떤 이유로 예외가 발생한다.

  2. 예외 객체 생성
    예외가 발생하면 해당 예외 클래스의 객체가 생성된다.

  3. 호출 스택 검색
    예외가 발생한 지점부터 호출 스택을 따라 올라가며 try-catch 블록을 찾는다.

  4. 처리 가능한 블록 발견
    호출 스택을 따라 올라가면서 예외를 처리할 수 있는 try-catch 블록을 찾으면 해당 블록이 실행된다.

  5. 예외 처리
    찾은 catch블록에서 예외를 처리한다.

  6. 처리 가능한 블록이 없을 경우
    호출 스택의 맨 위까지 예외를 처리할 수 있는 블록이 없다면 프로그램은 비정상 종료된다.

public class ExceptionExample {

    public static void main(String[] args) {
        try {
            methodA();
        } catch (CustomException e) {
            System.out.println("Caught CustomException: " + e.getMessage());
        }
    }

    public static void methodA() {
        try {
            methodB();
        } catch (NullPointerException e) {
            System.out.println("Caught NullPointerException: " + e.getMessage());
        }
    }

    public static void methodB() {
        throw new CustomException("Custom Exception in methodB");
    }
}

class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}
  1. methodB 에서 CustomException 예외를 발생 시켰다.
  2. 호출 스택을 따라 올라가며 try-catch 블록을 찾는다.
  3. methodB 에서 발생한 예외를 처리할 수 있는 try-catch블록은 methodA 블록에있다.
  4. methodAcatch블록의 의해 예외가 처리된다.

📌 만약 methodA에 try-catch 블록이 없다면?

만약 methodAtry-catch 블록이 없다면, 예외는 main메서드로 전파된다.

이 경우 main 메서드에서도 try-catch 블록이 없다면 예외는 최종적으로 스레드의 실행을 중단하고

예외 정보를 출력한 후 프로그램이 종료된다.

public class ExceptionExample {

    public static void main(String[] args) {
        try {
            methodA();
        } catch (CustomException e) {
            System.out.println("Caught CustomException in main: " + e.getMessage());
        }
    }

    public static void methodA() {
        methodB();
    }

    public static void methodB() {
        throw new CustomException("Custom Exception in methodB");
    }
}

class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

댓글남기기