在 Java 编程语言中,异常 (Exception) 是程序执行过程中可能出现的不正常情况。异常分为两类:检查异常 (Checked Exceptions) 和非检查异常 (Unchecked Exceptions)。它们的主要区别如下:
这里讲一个对应关系 检查异常 (Checked Exceptions)【非运行时异常】。非检查异常 (Unchecked Exceptions)【运行时异常】。
检查异常 (Checked Exceptions)【非运行时异常】
- 定义:检查异常是需要在编译时进行检查的异常。它们通常是可以预见并可以恢复的异常。
- 处理要求:编译器强制要求程序必须处理这些异常。处理方式包括使用 try-catch 块捕获异常,或者在方法签名中使用
throws
关键字声明异常。 - 常见示例:IOException、SQLException 等。
- 用途:用于表示程序外部条件的异常,例如文件未找到、网络错误等。
示例代码:
import java.io.*;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("nonexistentfile.txt"));
String line = reader.readLine();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
非检查异常 (Unchecked Exceptions)【运行时异常】
- 定义:非检查异常是指在编译时不进行检查的异常。它们通常是程序逻辑错误导致的异常,是程序员错误的结果。
- 处理要求:编译器不强制要求必须处理这些异常。程序员可以选择捕获处理,也可以忽略。
- 常见示例:RuntimeException 及其子类,例如 NullPointerException、ArrayIndexOutOfBoundsException 等。
- 用途:用于表示程序内部的逻辑错误或编程错误,例如空指针引用、数组越界等。
示例代码:
public class UncheckedExceptionExample {
public static void main(String[] args) {
String str = null;
try {
System.out.println(str.length());
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
关键区别
-
编译时检查:
- 检查异常:需要在编译时进行检查,必须明确处理。
- 非检查异常:编译时不进行检查,可以选择处理或不处理。
-
异常的性质:
- 检查异常:通常是可以预见并恢复的异常,多与外部资源相关。
- 非检查异常:通常是编程错误导致的异常,多与程序逻辑错误相关。
-
使用场景:
- 检查异常:适用于需要强制处理的外部异常情况。
- 非检查异常:适用于程序内部逻辑错误,不强制处理。
通过了解和区分检查异常与非检查异常,可以更好地编写健壮的 Java 程序,处理潜在的异常情况。