[Java] Chapter 11. 예외 처리

SeungWoo Cha·2025년 9월 10일

Chapter 11. 예외 처리

11.1. 예외와 예외 클래스

  • 일반 예외 (Exception) : 컴파일러가 예외 처리 코드 여부를 검사해야 하는 예외
  • 실행 예외 (RuntimeException) : 컴파일러가 검사하지 않는 예외 (Exception의 하위)

11.2. 예외 처리 코드

  • 기본 구조: try-catch-finally

  • 예외 발생 여부와 상관없이 finally 블록은 항상 실행됨

  • 예외 확인 방법

    try {
        int result = 10 / 0;
    } catch (Exception e) {
        System.out.println(e.getMessage());       // 예외 원인
        System.out.println(e.toString());         // 예외 종류 + 원인
        e.printStackTrace();                      // 예외 발생 위치까지 출력
    } finally {
        System.out.println("finally 블록 실행");
    }

11.3. 예외 종류에 따른 처리

  • 다중 catch 가능. 단, 하위 예외 → 상위 예외 순서로 작성

  • 여러 예외를 한 번에 처리: catch(A | B e)

    try {
        String data = null;
        System.out.println(data.length());
    } catch (NullPointerException | NumberFormatException e) {
        System.out.println("예외 발생: " + e.getMessage());
    }

11.4. 리소스 자동 닫기

  • 리소스(파일, DB 연결 등)는 사용 후 반드시 닫아야 함

  • 기존 방식 (finally 사용)

    FileInputStream fis = null;
    try {
        fis = new FileInputStream("file.txt");
        // 파일 읽기
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fis != null) try { fis.close(); } catch (IOException e) {}
    }
  • try-with-resources (Java 7~)

    try (FileInputStream fis = new FileInputStream("file.txt")) {
        // 파일 읽기
    } catch (IOException e) {
        e.printStackTrace();
    }
  • Java 9 이후 : 외부에서 선언한 리소스도 사용 가능

    FileInputStream fis1 = new FileInputStream("file1.txt");
    FileInputStream fis2 = new FileInputStream("file2.txt");
    try (fis1; fis2) {
        // 두 파일 처리
    }

11.5. 예외 떠넘기기 (throws)

  • 메소드에서 예외를 직접 처리하지 않고 호출한 쪽으로 전달

    public void readFile(String path) throws IOException {
        FileInputStream fis = new FileInputStream(path);
        fis.close();
    }
  • main()에서도 throws 가능 → JVM이 최종 처리


11.6. 사용자 정의 예외

1. 사용자 정의 예외 클래스

  • 일반 예외: Exception 상속
  • 실행 예외: RuntimeException 상속
public class MyException extends Exception {
    public MyException() {}
    public MyException(String message) {
        super(message);
    }
}

2. 예외 발생시키기

public void process(int value) throws MyException {
    if (value < 0) {
        throw new MyException("음수 값은 허용되지 않습니다.");
    }
    System.out.println("처리 완료: " + value);
}

public static void main(String[] args) {
    try {
        new Test().process(-5);
    } catch (MyException e) {
        System.out.println("예외 처리: " + e.getMessage());
    }
}

profile
한 발자국씩

0개의 댓글