Java에서 예외는 프로그램 실행 중에 발생할 수 있는 오류 및 예외 상황을 처리하는 데 사용된다.
Java의 예외에는 Checked Exception과 Unchecked Exception 두 가지 예외로 구분이 되는데 오늘은 Checked Exception과 Unchecked Exception에 대해 공부해 보자.
Checked Exception
Checked Exception은 아래와 같은 특징을 갖고 있다.
- RuntimeException을 상속하지 않는 클래스
- 컴파일 시점에 컴파일러에서 확인하는 예외
- 반드시 에러 처리를 해야 하는 특징(try/catch or throw)을 가지고 있다.
checked exception의 예시를 코드로 확인해 보자.
public class CheckedException {
public static void main(String[] args) {
try {
File file = new File("example.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("line = " + line);
}
scanner.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred while reading the file: " + e.getMessage());
}
}
}
위 코드는 example.txt라는 파일을 읽는 코드인데 실제로 example.txt 라는 파일은 존재하지 않기 때문에 문제가 있는 코드다. 그래서 example.txt 파일을 읽으려고 하면 예외처리(FileNotFoundException)를 진행한다.
즉 catch 안의 코드를 실행한다. 아래는 실제 에러 메시지이다.
An error occurred while reading the file: example.txt (No such file or directory)
위의 예시에서 나온 예외인 FileNotFoundException 이외에도 다른 예외도 많이 존재한다.
- IOException: 파일 또는 네트워크 연결에서 읽기 또는 쓰기와 같은 입력/출력 작업과 관련된 오류
- SQLException: 데이터베이스 액세스 및 쿼리와 관련된 오류
- ClassNotFoundException: 동적으로 클래스 로드와 관련된 오류
- InterruptedException: 스레드 중단 및 동기화와 관련된 오류의 경우
Unchecked Exception
Unchecked Exception의 특징은 아래와 같다.
- RuntimeException을 상속하는 클래스
- 런타임 단계에서 확인 가능
- 에러 처리를 강제하지 않는다.
Unchecked Exception은 checked exception과 다르게 컴파일 시 컴파일러에서 확인하지 않는 예외이다.
우리가 대표적으로 접할 수 있는 에러인 NullPointerException, ArrayIndexOutOfBoundsException 에러가 Unchecked Exception에 해당한다.
Unchecked exception도 예시 코드로 확인해 보자.
public class UncheckedException {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int index = 10;
System.out.println("number = " + numbers[index]);
}
}
위 코드는 길이가 3인, 즉 index가 2까지 밖에 존재하지 않는 배열의 10번째 index에 접근하려고 하는 코드이다.
당연히 아래와 같이 ArrayIndexOutOfBoundsException 에러가 발생한다.
위 예시 코드도 아래처럼 try ~ catch 문을 사용해 에러가 발생하는 지점에 예외처리를 해줄 수 있다.
public class UncheckedException {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int index = 10;
try {
int number = numbers[index];
System.out.println("number = " + number);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("An error occurred: " + e.getMessage());
// An error occurred: Index 10 out of bounds for length 3
}
}
}
정리
간단하게 정리하면 Checked Exception은 RuntimeException을 상속하지 않은 클래스이며, 예외처리를 반드시 해줘야 하고, Unchecked Exception은 코드에 개발자가 예상치 못한 에러가 발생할 수 있기 때문에 예외처리를 강제하지 않는다.
'Java' 카테고리의 다른 글
[Java] 리플렉션(Reflection)공부하기 (0) | 2023.03.01 |
---|---|
[Java] 제네릭(Generic)이란? (1) | 2023.02.28 |
[Java] Call By Reference와 Call By Value (0) | 2023.01.09 |
가비지 컬렉션(Garbage Collection)이란? (0) | 2023.01.03 |
JVM(Java Virtual Machine)이란? (0) | 2023.01.01 |