: 프로그램 실행 중 발생할 수 있는 비정상적인 상황
예시
Java 예외 계층
Throwable을 상속IOException, SQLException 등)NullPointerException, ArithmeticException 등)try 블록: 예외가 발생할 수 있는 코드 작성catch 블록: 예외 발생 시 처리finally 블록: 예외 발생 여부와 관계없이 항상 실행try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
} finally {
System.out.println("무조건 실행됩니다.");
}
throws를 사용하여 예외를 호출한 쪽에 위임void readFile() throws IOException {
FileReader fr = new FileReader("data.txt");
}
여러 예외를 각각 처리하거나, 공통 부모 타입으로 한 번에 처리할 수 있습니다.
try {
// 예외 발생 가능 코드
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("입출력 오류가 발생했습니다.");
}
Java 7 이상에서는 | 연산자로 묶어 처리 가능:
catch (IOException | SQLException e) {
e.printStackTrace();
}
기본 예외로 표현하기 어려운 상황에서는 직접 예외 클래스를 생성합니다.
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
사용 예시:
if (value < 0) {
throw new MyException("음수는 허용되지 않습니다.");
}
finally는 예외 발생 여부와 무관하게 항상 실행됩니다.
try {
// 파일 열기
} catch (IOException e) {
// 예외 처리
} finally {
// 파일 닫기
}
메서드 내에서 처리되지 않은 예외는 호출한 메서드로 전파됩니다.
throws로 위임하지 않으면 반드시 try-catch로 처리해야 함| 구분 | 설명 |
|---|---|
| Checked Exception | 반드시 처리해야 하는 예외 (IOException 등) |
| Unchecked Exception | 실행 시 발생, 선택적 처리 (NullPointerException 등) |
| try-catch-finally | 예외 처리 및 자원 해제 |
| throws 키워드 | 호출자에게 예외 위임 |
| 사용자 정의 예외 | 직접 예외 클래스를 생성해 필요한 상황에 사용 |
| 예외 전파 | 처리되지 않은 예외는 호출 스택을 따라 상위 메서드로 전달됨 |
📚 참고자료