java 中受检异常(checked exception)和非受检异常(unchecked exception)的核心区别在于编译器是否强制要求处理。受检异常必须通过 try-catch 捕获或 throws 声明抛出,否则代码无法编译;非受检异常继承自 runtimeexception,编译器不强制处理,通常由程序逻辑错误引发。

哪些常见异常属于受检异常
受检异常是 Exception 的直接子类,但排除掉 RuntimeException 及其子类。常见的包括 IOException、SQLException、ClassNotFoundException 等。这些异常通常代表外部环境或资源的问题,如文件不存在、网络中断或数据库连接失败,开发者应当预见并处理。

import java.io.*;
public class CheckedExample {
public static void main(String[] args) {
// 编译报错:必须处理 IOException
readFile("test.txt");
}
public static void readFile(String path) throws IOException {
FileReader fr = new FileReader(path);
int c = fr.read();
fr.close();
}
}
哪些常见异常属于非受检异常
非受检异常继承自 RuntimeException,例如 NullPointerException、IllegalArgumentException、IndexOutOfBoundsException。它们通常表示编程错误,如空指针引用、数组越界或参数非法。由于这类错误应在编码阶段避免,因此 Java 编译器不强制要求捕获。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

public class UncheckedExample {
public static void main(String[] args) {
String str = null;
// 运行时抛出 NullPointerException,无需在方法签名中声明
System.out.println(str.length());
}
}
自定义异常时如何决定类型
在创建自定义异常类时,如果该异常代表外部条件导致且调用者可以合理恢复,应继承 Exception 使其成为受检异常。如果异常代表程序内部逻辑错误或不可恢复的状态,则应继承 RuntimeException。例如,支付金额不足可设计为受检异常,而传入负数金额则应设计为非受检异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










