✅ 자바 예외 처리 완전 정리 (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가지
- try-catch 처리
try {
Class<?> clazz = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
- 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로 최종 예외 처리 |
'자바' 카테고리의 다른 글
Java 날짜/시간 클래스 완전 정복 (Date, Calendar, LocalDateTime, OffsetDateTime, ZonedDateTime) (0) | 2025.06.06 |
---|---|
java.lang 패키지 완전 정리 (0) | 2025.06.06 |
자바 예외 처리 완전 정리 (0) | 2025.06.05 |
자바 익명 객체 완전 정리 (0) | 2025.06.05 |
Java 중첩 클래스와 중첩 인터페이스 완전 정리 (1) | 2025.06.05 |