Java 异常分类体系受检异常Checked Exception继承自Exception类不包括RuntimeException分支编译器强制要求处理。典型场景包括文件I/O、数据库操作等外部依赖可能失败的情况。处理方式必须二选一使用try-catch块捕获处理方法声明中使用throws向上传递常见实现类IOExceptionSQLExceptionClassNotFoundException非受检异常Unchecked Exception包含两个子类运行时异常继承自RuntimeException反映程序逻辑错误错误继承自Error表示JVM系统级故障典型特征编译器不强制处理出现时通常导致线程终止常见类型包括空指针、数组越界等自定义异常实现规范受检异常定义需继承Exception基类建议包含构造方法重载public class BusinessException extends Exception { public BusinessException(String message) { super(message); } public BusinessException(String message, Throwable cause) { super(message, cause); } }非受检异常定义继承RuntimeException推荐实现链式构造public class ValidationException extends RuntimeException { public ValidationException(String message) { super(message); } public ValidationException(String message, Throwable cause) { super(message, cause); } }异常处理机制对比try-catch-finally 结构概述try-catch-finally 是编程中用于异常处理的核心结构主要功能是捕获和处理代码执行过程中可能出现的错误并确保资源被正确释放。基本语法try { // 可能抛出异常的代码 } catch (ExceptionType e) { // 处理特定类型的异常 } finally { // 无论是否发生异常都会执行的代码 }各部分作用try 块包含可能抛出异常的代码。若发生异常程序立即跳转到对应的 catch 块。catch 块捕获并处理特定类型的异常。支持多个 catch 块按顺序匹配异常类型。finally 块无论是否发生异常都会执行常用于释放资源如关闭文件、数据库连接。执行顺序执行 try 块中的代码。若抛出异常匹配对应的 catch 块并执行。无论是否捕获异常finally 块都会执行。示例代码try { int result 10 / 0; // 抛出 ArithmeticException } catch (ArithmeticException e) { System.out.println(除零错误: e.getMessage()); } finally { System.out.println(finally 块已执行); }注意事项finally 的优先级即使 try 或 catch 中有 return 语句finally 仍会执行。资源管理Java 7 推荐使用 try-with-resources 替代 finally 手动关闭资源。异常传播若 finally 中抛出异常会覆盖 try/catch 中的异常。变体try-with-resources自动关闭实现AutoCloseable的资源无需显式 finallytry (FileInputStream fis new FileInputStream(file.txt)) { // 使用资源 } catch (IOException e) { // 处理异常 }常见问题多重 catch 顺序子类异常需排在父类之前。finally 中的 return会覆盖 try/catch 的返回值。throw 关键字的作用throw 关键字用于在程序中显式抛出异常。当代码执行过程中遇到无法处理的错误情况时可以通过 throw 主动触发异常中断当前执行流程并将控制权交给最近的异常处理机制。throw 的基本语法throw expression;expression 可以是任意类型的值但通常是一个 Error 对象或其子类实例。例如throw new Error(Something went wrong);throw 的使用场景参数验证在函数开头检查参数有效性发现无效时立即抛出异常function divide(a, b) { if (b 0) { throw new RangeError(Divisor cannot be zero); } return a / b; }自定义错误类型通过继承 Error 创建特定领域的错误类型class NetworkError extends Error { constructor(message) { super(message); this.name NetworkError; } } throw new NetworkError(Connection timeout);异步代码中的错误处理在 Promise 或 async/await 中通过 throw 触发 rejectionasync function fetchData() { const response await fetch(api/data); if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } return response.json(); }最佳实践优先使用内置错误类型根据错误性质选择最匹配的内置错误类型Error通用错误RangeError数值越界TypeError类型不符SyntaxError语法错误ReferenceError引用不存在包含有意义的错误信息错误消息应清晰说明问题原因和解决方案throw new TypeError(Expected a string, received typeof value);错误传播在适当的层级处理异常低层代码抛出高层代码捕获function processUserInput(input) { if (!input) { throw new Error(Input cannot be empty); } // 处理逻辑... } try { processUserInput(); } catch (err) { console.error(Processing failed:, err.message); }工程实践建议异常选择原则受检异常用于可预见的、可恢复的异常情况非受检异常用于程序逻辑错误或不可控系统故障性能注意事项避免在循环体内使用try-catch异常实例化会采集栈轨迹影响性能高频操作建议使用状态码代替异常日志记录规范应包含完整异常链信息try { // ... } catch (Exception e) { log.error(操作失败原因: {}, e.getMessage(), e); throw new BusinessException(包装后异常, e); }