源本科技 | 码上会

企业社招真题 Java 异常处理

2026/04/05
2
0

Java 异常处理机制及 try-catch-finally 执行流程

Java 异常处理机制基于 Throwable 体系,将程序错误分为错误(Error)和异常(Exception),通过 try-catch-finally 实现捕获和处理,避免程序直接崩溃。try 代码块存放可能抛出异常的逻辑;catch 匹配并处理对应异常,可写多个匹配不同类型;finally 用于释放资源,无论是否发生异常、是否捕获成功,最终都会执行。执行流程:正常执行 try 后走 finally;try 抛出异常,匹配到 catch 则执行 catch 逻辑,再走 finally;try/catch 中有 return,finally 仍会执行,若 finally 内有 return 会覆盖原有返回值。

异常链的作用

异常链是将底层原始异常包装后向上抛出,形成完整的异常传递链路,核心作用是保留异常根源,同时屏蔽底层细节。在分层开发中,DAO 层抛出数据库异常,若直接抛出会暴露底层实现,Service 层可将其包装为自定义业务异常抛出,同时通过 initCause() 保留原始异常信息。异常链能让开发者快速定位问题根因,避免异常信息丢失,同时符合分层设计原则,不向调用方暴露底层技术细节,是企业级开发中异常处理的标准用法。

受检异常与非受检异常的区别

受检异常和非受检异常是 Exception 的两大分类,核心区别是编译期是否强制处理。受检异常是 Exception 下排除 RuntimeException 的异常,如 IOExceptionSQLException,编译阶段必须捕获或抛出,用于可预期、可恢复的异常场景。非受检异常包含 RuntimeException(空指针、数组越界)和 Error(内存溢出),编译不检查,运行时触发,多为程序逻辑错误。受检异常强制开发者处理,保证程序健壮性;非受检异常无需强制声明,用于代码 bug 类问题。

异常处理最佳实践

Java 异常处理有成熟的最佳实践,能提升程序稳定性和可维护性。第一,精准捕获具体异常,不使用大范围 Exception 捕获,避免掩盖未知问题。第二,不写空 catch 块,必须记录完整日志,包含异常信息和上下文。第三,用 try-with-resources 替代手动 finally 关闭资源,避免泄漏。第四,自定义业务异常,区分系统异常和业务异常,使用异常链传递根因。第五,禁止捕获 Error,不滥用异常控制业务流程。第六,不在 finally 中使用 return,防止覆盖正常返回值,保证异常处理规范可靠。