자바

자바 예외 처리 완전 정리 (try-catch, throws, 다중 catch 등)

a-bell2 2025. 6. 6. 10:37

 

✅ 자바 예외 처리 완전 정리 (try-catch, throws, 다중 catch 등)

📌 예외(Exception)란?

프로그램 실행 도중 예상치 못한 상황이나 오류가 발생하면 프로그램이 갑자기 종료될 수 있습니다. 이러한 상황을 "예외"라고 하며, 자바에서는 예외가 발생해도 프로그램이 중단되지 않도록 예외 처리 코드를 작성할 수 있습니다.


1. 예외 처리란?

예외가 발생했을 때 프로그램의 비정상 종료를 방지하고, 안정적으로 실행을 이어가도록 도와주는 것이 예외 처리입니다.

  • 일반 예외(Checked Exception): 컴파일 시점에 예외 처리를 강제함
  • 실행 예외(Unchecked Exception): 컴파일러가 체크하지 않음, 개발자가 직접 대비 필요

2. try-catch-finally 블록

자바에서는 예외 처리를 위해 try-catch-finally 구조를 사용합니다. 이 구조는 예외가 발생할 수 있는 코드예외 발생 시 처리 방법, 그리고 마무리 작업을 구분해줍니다.

블록  설명
try 예외가 발생할 수 있는 코드를 작성
catch 발생한 예외를 처리하는 코드
finally 예외 발생 여부와 관계없이 항상 실행 (자원 정리 등)

🔸 사용 예시

try {
    // 예외 발생 가능 코드
} catch (IOException e) {
    // 입출력 예외 처리
} catch (Exception e) {
    // 그 외 일반 예외 처리
} finally {
    // 무조건 실행되는 블록 (자원 해제 등)
}

3. 다중 catch

try 블록에서 여러 종류의 예외가 발생할 수 있는 경우, 각각에 대응하는 catch 블록을 여러 개 작성할 수 있습니다.

try {
    String str = null;
    System.out.println(str.length());
    int num = Integer.parseInt("abc");
} catch (NullPointerException e) {
    System.out.println("null 참조 오류 발생");
} catch (NumberFormatException e) {
    System.out.println("숫자 형식 오류 발생");
} catch (Exception e) {
    System.out.println("기타 예외 발생");
}

단, 예외가 발생하면 첫 번째로 해당되는 catch 블록만 실행되며, 나머지는 실행되지 않습니다.


💡 catch 블록 작성 순서 주의

  • 상세한 예외(하위 클래스) → 위쪽에
  • 포괄적인 예외(상위 클래스, Exception 등) → 아래쪽에

잘못된 예:

catch (Exception e) { ... }
catch (NullPointerException e) { ... } // 컴파일 에러 발생

올바른 예:

catch (NullPointerException e) { ... }
catch (Exception e) { ... }

4. throws 키워드

예외가 발생할 수 있는 메소드에서 직접 처리하지 않고 호출한 쪽으로 예외를 넘기고 싶을 때는 throws 키워드를 사용합니다.

public void method() throws IOException, SQLException {
    // 예외 발생 가능 코드
}

이런 메소드를 호출하려면 두 가지 방법 중 하나를 선택해야 합니다:

  • try-catch로 직접 예외 처리
  • 호출한 메소드도 throws로 예외를 위임

🔸 사용 예

public void method2() throws Exception {
    throw new Exception("에러 발생");
}

public void method1() {
    try {
        method2();
    } catch (Exception e) {
        System.out.println("예외 처리: " + e.getMessage());
    }
}

5. 자바 API와 throws

많은 자바 표준 라이브러리 메소드가 throws를 통해 예외 가능성을 선언합니다.

예: Class.forName() 메소드

public static Class<?> forName(String className) throws ClassNotFoundException

예외 처리 방법 2가지

  1. try-catch 처리
try {
    Class<?> clazz = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
  1. throws로 위임
public void loadClass() throws ClassNotFoundException {
    Class<?> clazz = Class.forName("java.lang.String");
}

6. main() 메소드에서 throws 사용

main 메소드에서도 예외를 던질 수 있지만, 일반적으로는 try-catch로 직접 처리하는 것이 더 바람직합니다. 예외가 처리되지 않으면 JVM이 예외 내용을 콘솔에 출력하고 프로그램을 종료하기 때문입니다.

public static void main(String[] args) {
    try {
        findClass();
    } catch (ClassNotFoundException e) {
        System.out.println("클래스를 찾을 수 없습니다.");
    }
}

🔑 핵심 요약

구분  설명
예외 처리 목적 프로그램의 비정상 종료 방지
try-catch-finally 예외 발생 → 처리 → 마무리 구조
다중 catch 예외 종류별로 분기 처리
catch 순서 하위 예외 먼저, 상위 예외는 마지막에
throws 예외를 직접 처리하지 않고 호출자에게 위임
API 예외 처리 API 문서의 throws 예외는 반드시 처리 필요
main 메소드 예외 가급적 try-catch로 최종 예외 처리