예외(Exception)는 프로그램 실행 도중 예기치 않은 상황이 발생했을 때 이를 처리하기 위해 사용됩니다. 예외는 프로그램의 정상적인 흐름을 방해하지 않고, 오류 상황을 처리할 수 있도록 도와줍니다. 이 글에서는 예외의 개념, 상속 구조, 주요 예외 클래스, 예외 처리 방법 등에 대해 설명하겠습니다.
try
, catch
, finally
블록을 사용하여 예외를 처리합니다.Java의 예외 클래스는 계층적 구조로 되어 있으며, 모든 예외 클래스는 Throwable
을 기본 클래스로 상속받습니다. 주요 예외 클래스와 그 하위 클래스들은 다음과 같습니다.
Throwable
Exception
Exception
클래스는 대부분의 표준 예외 클래스의 기본 클래스입니다.RuntimeException
NullPointerException
: 객체 참조가 없을 때 발생IndexOutOfBoundsException
: 인덱스가 범위를 벗어날 때 발생IllegalArgumentException
: 부적절한 인자가 전달되었을 때 발생IOException (입출력 예외)
FileNotFoundException
: 파일을 찾을 수 없을 때 발생EOFException
: 파일 끝에 도달했을 때 발생SQLException (SQL 관련 예외)
ClassNotFoundException
InterruptedException
Java에서는 try
블록을 사용하여 예외가 발생할 가능성이 있는 코드를 감싸고, catch
블록을 사용하여 예외를 처리합니다.
try {
// 예외가 발생할 가능성이 있는 코드
int result = 10 / 0;
} catch (ArithmeticException e) {
// 예외가 발생했을 때 실행할 코드
System.out.println("0으로 나눌 수 없습니다.");
} finally {
// 예외 발생 여부와 상관없이 항상 실행할 코드
System.out.println("프로그램 종료");
}
사용자 정의 예외는 Exception 클래스를 상속받아 정의합니다.
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
try {
throw new MyCustomException("이것은 사용자 정의 예외입니다.");
} catch (MyCustomException e) {
System.out.println(e.getMessage());
}
예외는 상위 호출 스택으로 전파될 수 있습니다. 메소드 내에서 예외가 처리되지 않으면 해당 메소드를 호출한 위치로 예외가 전달됩니다.
public void method1() throws MyCustomException {
throw new MyCustomException("에러 발생");
}
public void method2() {
try {
method1();
} catch (MyCustomException e) {
System.out.println("method2에서 예외 처리: " + e.getMessage());
}
}
method2();
Java에서는 예외 체인(Exception Chaining)을 통해 하나의 예외가 다른 예외의 원인이 되었음을 나타낼 수 있습니다. throw 구문에 예외를 포함하여 예외 체인을 구성합니다.
try {
throw new IllegalArgumentException("기본 예외");
} catch (IllegalArgumentException e) {
throw new RuntimeException("다른 예외 발생", e);
}
때때로 예외를 처리한 후 다시 발생시켜야 할 필요가 있습니다. 이는 예외를 부분적으로 처리하고, 나머지는 상위 코드에서 처리하도록 할 때 유용합니다.
try {
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("처리된 예외: " + e.getMessage());
throw e; // 예외를 다시 발생시킴
}
} catch (ArithmeticException e) {
System.out.println("최종 처리: " + e.getMessage());
}