Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
🐙 Checked Exception과 Unchecked Exception의 차이 본문
Checked Exception과 Unchecked Exception의 차이
1. Checked Exception(예외)
- Checked Exception은 컴파일러가 강제로 예외 처리를 요구하는 예외다.
- RuntimeException 클래스를 상속하지 않은 예외들이 Checked Exception에 해당한다. (사진 상 오른쪽)
- 주로 외부 리소스와의 상호 작용이나 I/O 작업과 관련된 예외 등이 여기에 속한다.
- Checked Exception이 발생할 수 있는 메서드에서는 반드시 예외 처리를 해야 한다. (try-catch 블록 또는 메서드 선언에 throws를 사용하여 예외 전파)
2. Unchecked Exception(= RuntimeException)
- Unchecked Exception은 컴파일러가 예외 처리를 강제하지 않는 예외다.
- RuntimeException 클래스를 상속한 예외들이 Unchecked Exception에 해당한다. (사진 상 왼쪽)
- 주로 프로그래머의 실수에 기인한 예외 또는 런타임에 발생하는 예외 등이 여기에 속한다.
- Unchecked Exception이 발생할 수 있는 메서드에서는 예외 처리를 하지 않아도 된다.
(하지만 예외가 발생하면 프로그램이 비정상적으로 종료될 수 있음)
특성 | Checked Exception | UnChecked Exception (= RuntimeException) |
처리 여부 | 반드시 예외 처리 필요 (try-catch 블록 또는 throws 선언) |
예외 처리가 선택 사항 |
컴파일러 강제 여부 | 예 | 아니오 |
발생 원인 | 주로 외부 리소스와의 상호작용, I/O 작업과 관련된 예외 등 |
주로 프로그래머의 실수, 런타임 시 발생 가능한 예외 등 |
클래스 계층 구조 | Exception 클래스의 하위 클래스 (RuntimeException 제외) |
RuntimeException 클래스의 하위 클래스 |
예시 | IOException, SQLException 등 | NullPointException, ArrayIndexOutOfBoundsException 등 |
Checked Exception 예시
- IOException : 파일 입출력 작업에서 발생하는 예외로, 파일이 존재하지 않거나, 읽거나 쓰기 권한이 없는 경우에 발생
import java.io.FileReader;
import java.io.IOException;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
FileReader file = new FileReader("file.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
}
- SQLException : 데이터베이스와 관련된 작업에서 발생하는 예외로, SQL 문을 실행하는 동안 오류가 발생한 경우에 발생
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "password");
// ...
} catch (SQLException e) {
e.printStackTrace();
}
}
}
UnChecked Exception 예시
- ArithmeticException: 산술 연산 중에 발생하는 예외로, 0으로 나누거나 모듈로 연산에서 0으로 나머지를 구하는 경우에 발생
public class UncheckedExceptionExample {
public static void main(String[] args) {
int result = 10 / 0;
System.out.println(result); // 이 부분은 실행되지 않음
}
}
- NullPointerException: null에 대한 메서드 호출이나 필드 접근 시에 발생하는 예
public class UncheckedExceptionExample {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // 이 부분에서 NullPointerException 발생
}
}
- ArrayIndexOutOfBoundsException: 배열의 범위를 벗어난 인덱스로 접근 시에 발생
public class UncheckedExceptionExample {
public static void main(String[] args) {
int[] arr = new int[5];
System.out.println(arr[10]); // 이 부분에서 ArrayIndexOutOfBoundsException 발생
}
}
- NumberFormatException: 문자열을 숫자로 변환할 때, 유효하지 않은 형식의 문자열이 입력되는 경우에 발생
public class UncheckedExceptionExample {
public static void main(String[] args) {
String str = "abc";
int num = Integer.parseInt(str); // 이 부분에서 NumberFormatException 발생
}
}
🤔 느낀점
예외 종류별로 코드상에 다 명시해주는게 좋을까?
여러 다양한 예외가 발생하는 로직이 있다고 가정했을 경우, Exception만으로 catch부분에서 잡아주면 간결하게 예외처리를 할 수 있지 않을까?
물론 구체적으로 예외처리를 해준다면, 코드별로 독립적으로 세밀한 제어가 가능하고, 디버깅 및 유지보수가 쉽다고 하는데
모든 예외에 대한 처리 코드를 작성하면 코드양도 증가하고, 새로운 예외가 발생할때마다 코드를 업데이트해야 할텐데 번거롭지 않을까?
디버깅이나 특정 예외에 대한 세부적인 조치가 필요한 경우가 많을테니 구체적으로하는게 더 좋은것 같다는 생각이 있는데,
실제로 실무에서는 어떻게 하는지 궁금하다.
예외를 기록하고 모니터링하는 로깅 시스템에서는 모두 세밀하게 처리할까? 아니면 중요하지 않은 부분은 공통으로 처리할까?
'언어 > Java' 카테고리의 다른 글
🐙 Reflection이란 무엇이고 어떻게 사용하는것인가? (1) | 2023.12.23 |
---|---|
🐙 Java의 어노테이션이란 무엇이고 어떻게 사용할까? (0) | 2023.12.22 |
🐙 Java에서 Exception과 Error의 차이점 (0) | 2023.12.22 |
🐙 Java의 enum은 뭘까? 어떤 상황에서 enum을 사용하면 좋을까? (0) | 2023.12.21 |
🐙 static 키워드를 잘못 사용했을 때 발생할 수 있는 문제와 올바른 사용법 (1) | 2023.12.21 |