Java中受检异常必须显式处理(try-catch或throws),否则编译失败,如IOException;非受检异常(RuntimeException及其子类)可选捕获,编译器不强制,如NullPointerException。

Java 中受检异常(Checked Exception)必须显式处理,否则编译不通过;非受检异常(Unchecked Exception,即 RuntimeException 及其子类)可选择性捕获,编译器不强制要求。
受检异常:必须 try-catch 或 throws
比如 IOException、SQLException 这类异常,编译器会检查你是否处理。不处理直接编译报错。
- 用 try-catch 捕获并处理:
File file = new File("test.txt");
try {
FileReader reader = new FileReader(file);
} catch (FileNotFoundException e) {
System.err.println("文件没找到:" + e.getMessage());
}
- 或用 throws 声明抛出,由调用方处理:
public void readFile() throws FileNotFoundException {
FileReader reader = new FileReader("test.txt");
}
立即学习“Java免费学习笔记(深入)”;
非受检异常:可捕获,但不强制
比如 NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException,属于 RuntimeException 子类,编译器不管你捕不捕获。
- 可以捕获(适合预判可能出错且想友好提示的场景):
int[] arr = {1, 2, 3};
try {
System.out.println(arr[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("下标越界了,请检查数组长度");
}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 通常更推荐提前校验,而不是依赖捕获:
if (arr != null && index >= 0 && index System.out.println(arr[index]);
} else {
System.out.println("索引无效");
}
一个 try 可以捕获多种异常(Java 7+)
受检和非受检异常可以共存于同一个 try 块中,用多个 catch 分别处理:
try {
FileReader reader = new FileReader("data.txt");
int value = 10 / 0;
} catch (FileNotFoundException e) { // 受检
System.err.println("文件问题:" + e.getMessage());
} catch (ArithmeticException e) { // 非受检
System.err.println("数学错误:" + e.getMessage());
}
注意:catch 的顺序不能错
子类异常必须写在父类前面,否则编译报错。例如不能把 Exception(父类)写在 IOException(子类)之前:
// ❌ 错误写法:
catch (Exception e) { ... }
catch (IOException e) { ... } // 编译失败:已由前一个 catch 捕获
// ✅ 正确写法:
catch (IOException e) { ... }
catch (Exception e) { ... }

















