当前位置: 首页 > news >正文

195. Java 异常 - finally 块:Java 中的“兜底侠”

文章目录

  • 195. Java 异常 - finally 块:Java 中的“兜底侠”
    • 💡 finally 是什么?
    • ✅ 使用场景
    • 🔍 示例讲解:writeList 方法的 finally
      • 📌 可能的三种退出方式:
    • ⚠️ 注意事项
      • 1. ❗ `JVM `崩溃时` finally` 不保证执行
      • 2. ❗ finally 中的异常不能被忽视
    • 🌱 `Java 7` 提示:`try-with-resources` 更优雅!
    • 🧠 小结

195. Java 异常 - finally 块:Java 中的“兜底侠”


💡 finally 是什么?

finally 块无论 try 块是否抛出异常,总会被执行。这是它最强大的地方。也正因为如此,它成为我们做资源清理时最可靠的方式。


✅ 使用场景

为什么我们需要 finally?

  • ✅ 防止 忘记关闭资源
  • ✅ 即使 try 里面有 return/continue/breakfinally 仍会执行!
  • ✅ 不管是 正常流程 还是 异常流程,清理代码都不会被跳过

🔍 示例讲解:writeList 方法的 finally

PrintWriter out = null;
try {out = new PrintWriter(new FileWriter("OutFile.txt"));for (int i = 0; i < SIZE; i++) {out.println("Value at: " + i + " = " + list.get(i));}
} catch (IOException | IndexOutOfBoundsException e) {System.err.println("Exception: " + e.getMessage());
} finally {if (out != null) {System.out.println("Closing PrintWriter");out.close();} else {System.out.println("PrintWriter not open");}
}

📌 可能的三种退出方式:

  1. new FileWriter(...) 抛出 IOException
  2. list.get(i) 抛出 IndexOutOfBoundsException
  3. 所有代码正常执行完毕

✅ 不论哪种情况,finally 都会执行,确保 PrintWriter 被关闭,避免资源泄漏。


⚠️ 注意事项

1. ❗ JVM 崩溃时 finally 不保证执行

System.exit(1); // 一旦调用此方法,finally 也不执行!

所以不要依赖 finally 去写非常关键的业务逻辑,比如“写入数据库”或“发送日志服务”。


2. ❗ finally 中的异常不能被忽视

如果 finally 中再抛异常,而 trycatch 中也有异常,那么 finally 的异常会覆盖前面的异常信息,造成调试困难。

👉 建议在 finally 中加 try-catch,确保异常被妥善处理:

finally {try {if (out != null) out.close();} catch (IOException e) {System.err.println("Error closing writer: " + e.getMessage());}
}

🌱 Java 7 提示:try-with-resources 更优雅!

Java 7 开始,如果你操作的是 CloseableAutoCloseable 的资源(比如 FileWriterScannerSocket 等),可以使用 try-with-resources 自动关闭它们,代码更简洁,风险更低!

👀 我们稍后会详细介绍!


  • “finally 就像 Java 中的保底侠,确保你永远不会‘忘了关灯’。”
  • “它最大的价值不是处理异常,而是保障资源一定被释放。”
  • “finally 可以执行 return、break、continue 之后的收尾动作,这点特别容易被忽视。”

🧠 小结

特性说明
执行时机无论是否抛异常,finally 都执行
使用目的做资源释放、清理现场等工作
注意事项避免在 finally 抛新异常、避免依赖它做关键逻辑
更优选择Java 7 起推荐使用 try-with-resources
http://www.dtcms.com/a/394102.html

相关文章:

  • C语言底层学习(2.指针与数组的关系与应用)(超详细)
  • 008 Rust注释
  • ubuntu防火墙开放端口
  • ​MySQL 8.0.29 RPM 安装教程(CentOS 7 / RHEL 7 详细步骤)​附安装包
  • AIPPT:AI一键生成高质量PPT
  • [已更新]2025华为杯E题数学建模研赛E题研究生数学建模思路代码文章成品:高速列车轴承智能故障诊断问题
  • 从零到一:Vue3 + Spring Boot + MySQL 全栈项目部署到阿里云服务器完整教程
  • 微服务基础2-网关路由
  • ubuntu创建新用户
  • 黑豹X2(Panther-x2)armbian 驱动NPU/VPU的驱动下载安装
  • 50.Mysql主从复制与读写分离
  • 软件设计师,经典计算题
  • Python的bz2库讲解
  • 抖音2025创作者大会:优质内容播放时长增220%,推出四大计划
  • C++面向对象编程之继承:深入理解与应用实践
  • [Windows] OFD转PDF 1.2.0
  • TDengine 聚合函数 VAR_POP 用户手册
  • 跨域及其解决方法
  • LeetCode:37.二叉树的最大深度
  • 【C++深学日志】C++“类”的完全指南--从基础到实践(一)
  • BUS-消息总线
  • 23种设计模式之【单例模式模式】-核心原理与 Java实践
  • 精度至上,杜绝失真,机器视觉检测中为何常用BMP格式?
  • 关于wireshark流量分析软件brim(Zui)安装方法
  • springboot3.4.1集成pulsar
  • 信息量、熵、KL散度和交叉熵
  • 使用Python一站式提取Word、Excel、PDF 和PPT文档内容v1.0
  • 线性代数 | REF / RREF
  • TLCP的一些内容
  • dock容器网络存储相关练习