Software Engineer · 语言与工程基础

Java 异常:传播、资源释放与 finally 的边界

解释 try/catch/finally 与 try-with-resources,避免吞错和覆盖原异常。

题目重点:解释 try/catch/finally 与 try-with-resources,避免吞错和覆盖原异常。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论正常异常控制流;进程终止或严重运行时故障不能假定 finally 总会执行。

解题路线

  1. 从可恢复性决定在哪里处理:边界层把明确失败转换为业务错误,底层保留 cause,无法处理时传播。checked 与 unchecked 影响编译期声明要求,不直接代表错误严重程度。
  2. 多个 catch 从更具体到更一般;捕获后记录上下文,避免每层重复打印同一错误或悄悄返回成功。
  3. finally 用于清理,但其中 return/throw 会覆盖先前返回值或异常。AutoCloseable 资源优先 try-with-resources,保留主异常与 suppressed 清理异常。
  4. 重试只用于明确瞬时错误;有副作用操作必须有幂等键、退避和总时间预算。异常处理不是无限重试。

手动走一遍

文件解析抛出格式错误,同时 close 失败:try-with-resources 保留格式错误为主异常,close 错误加入 suppressed。finally return 0 会覆盖 try return 1,使诊断困难;清理块不应承担正常返回决策。

规模与取舍

异常栈构造和重复日志有成本,热路径的预期分支不宜用异常驱动。资源数量与清理成本随工作负载变化。

易错点与追问

容易失分的边界

  • catch Exception 后返回空集合,掩盖失败。
  • finally 总会执行的绝对说法。
  • 日志输出凭证或敏感输入。

继续深挖

  • 取消与 interruption 如何传播?
  • 多个资源关闭顺序怎样影响依赖?
✓已复制微信号!