题目重点:解释 try/catch/finally 与 try-with-resources,避免吞错和覆盖原异常。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论正常异常控制流;进程终止或严重运行时故障不能假定 finally 总会执行。
解题路线
- 从可恢复性决定在哪里处理:边界层把明确失败转换为业务错误,底层保留 cause,无法处理时传播。checked 与 unchecked 影响编译期声明要求,不直接代表错误严重程度。
- 多个 catch 从更具体到更一般;捕获后记录上下文,避免每层重复打印同一错误或悄悄返回成功。
- finally 用于清理,但其中 return/throw 会覆盖先前返回值或异常。AutoCloseable 资源优先 try-with-resources,保留主异常与 suppressed 清理异常。
- 重试只用于明确瞬时错误;有副作用操作必须有幂等键、退避和总时间预算。异常处理不是无限重试。
手动走一遍
文件解析抛出格式错误,同时 close 失败:try-with-resources 保留格式错误为主异常,close 错误加入 suppressed。finally return 0 会覆盖 try return 1,使诊断困难;清理块不应承担正常返回决策。
规模与取舍
异常栈构造和重复日志有成本,热路径的预期分支不宜用异常驱动。资源数量与清理成本随工作负载变化。
易错点与追问
容易失分的边界
- catch Exception 后返回空集合,掩盖失败。
- finally 总会执行的绝对说法。
- 日志输出凭证或敏感输入。
继续深挖
- 取消与 interruption 如何传播?
- 多个资源关闭顺序怎样影响依赖?
