Java에서 예외는 크게 두 가지 종류로 나뉩니다. CheckedException과 UncheckedException. 이 두 예외는 예외 발생 시 처리해야 할 방식에 따라 구분됩니다.
CheckedException은 컴파일 시점에 예외 처리를 강제하는 예외입니다. 즉, 이러한 예외가 발생할 가능성이 있는 메소드를 호출할 때는 반드시 예외 처리를 해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
특징:
예시:
public void readFile(String fileName) {
try {
FileReader file = new FileReader(fileName); // FileNotFoundException이 발생할 수 있음
BufferedReader fileInput = new BufferedReader(file);
// 파일에서 데이터 읽기
fileInput.close();
} catch (FileNotFoundException e) {
e.printStackTrace(); // 예외 처리
} catch (IOException e) {
e.printStackTrace(); // 예외 처리
}
}
위의 예제에서 FileNotFoundException과 IOException은 CheckedException입니다. 파일 작업 중 발생할 수 있는 오류이므로, 반드시 예외 처리를 해야 합니다.
UncheckedException은 컴파일러가 예외 처리를 강제하지 않는 예외입니다. 즉, 이러한 예외는 컴파일 시점에서 체크되지 않으며, 런타임 시점에서 발생합니다. 예외 처리(try-catch)가 선택 사항이며, 예외가 발생하더라도 해당 예외를 처리하지 않아도 컴파일 오류가 발생하지 않습니다.
특징:
예시:
public void divide(int a, int b) {
int result = a / b; // b가 0일 경우 ArithmeticException 발생
}
public void accessArray(int[] arr, int index) {
int value = arr[index]; // index가 배열의 크기를 벗어나면 ArrayIndexOutOfBoundsException 발생
}
위의 예제에서 ArithmeticException과 ArrayIndexOutOfBoundsException은 UncheckedException입니다. 런타임에 발생할 수 있으며, 예외를 처리하지 않아도 컴파일 오류는 발생하지 않습니다.
비교 항목 | CheckedException | UncheckedException (RuntimeException) |
---|---|---|
처리 시점 | 컴파일 시점에 처리 강제 | 런타임 시점에 발생하며 처리 선택적 |
예외 처리 강제 여부 | 반드시 try-catch 나 throws 로 처리해야 함 | 예외 처리 선택적, 처리하지 않아도 컴파일됨 |
상속 | Exception 클래스에서 파생 | RuntimeException 클래스에서 파생 |
주로 발생하는 상황 | 외부 환경에 의한 오류 (파일, 네트워크, DB 등) | 개발자의 실수나 논리적 오류 (잘못된 연산 등) |
예시 | IOException , SQLException | NullPointerException , ArrayIndexOutOfBoundsException , ArithmeticException |