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

【Java 开发日记】finally 释放的是什么资源?

目录

详细解释

1. 为什么需要 finally?

2. finally 如何解决问题?

常见的需要释放的资源包括:

现代写法:try-with-resources

总结


finally 块本身并不直接释放资源,但它提供了一个保证执行的代码块,我们在这个代码块中手动编写释放资源的代码

简单来说:finally 块是释放资源的“黄金位置”,我们在这里手动关闭文件、数据库连接、网络连接等。

详细解释

1. 为什么需要 finally?

程序在运行时可能会发生异常(Exception)。当异常被抛出时,程序会中断当前的执行流程,跳转到能够处理该异常的 catch 块。这会导致一个严重问题:在异常发生点之后的代码可能没有机会执行。

考虑一个没有 finally 的场景:

public void readFile() {FileInputStream file = null;try {file = new FileInputStream("myfile.txt");// 1. 打开文件资源// ... 读取文件,假设这里发生了 IOException// 2. 使用资源file.close(); // 3. 关闭资源 - 如果上面发生异常,这行代码永远执行不到!} catch (IOException e) {e.printStackTrace();}// 文件描述符未被关闭,资源泄漏!
}

在上面的代码中,如果在“读取文件”时发生异常,程序会立刻跳转到 catch 块,file.close() 这行代码就被跳过了。这个文件句柄/描述符就一直没有被释放,导致资源泄漏。如果这种情况发生多次,可能会耗尽系统资源(如可用的文件句柄数量),导致程序甚至系统崩溃。

2. finally 如何解决问题?

finally 块的关键特性是:无论 try 块中是否发生异常,也无论是否被 catch 捕获,甚至 try 块中有 return 语句,finally 块中的代码都保证会执行

因此,我们把释放资源的代码放在 finally 块中,确保万无一失。

public void readFile() {FileInputStream file = null;try {file = new FileInputStream("myfile.txt");// ... 读取文件,可能发生异常} catch (IOException e) {e.printStackTrace();} finally {// 无论 try 成功还是失败,都会执行这里的代码if (file != null) {try {file.close(); // 确保文件被关闭} catch (IOException e) {e.printStackTrace(); // 关闭操作本身也可能出错}}}
}

现在,无论 try 块中发生什么,我们都能在 finally 块中安全地关闭文件,释放它占用的系统资源。

常见的需要释放的资源包括:

  • 文件 I/O 流:FileInputStream, FileOutputStream, Reader, Writer 等。
  • 数据库连接:java.sql.Connection 对象。数据库连接池非常宝贵,必须在使用后归还/关闭。
  • 网络连接:Socket 等。
  • 图形资源:在某些环境中,需要手动释放图形上下文等。

现代写法:try-with-resources

从 Java 7 开始,引入了 try-with-resources 语法,这是一种更优雅、更简洁的自动资源管理方式。它能自动在 try 块结束时调用资源的 close() 方法,本质上还是在背后使用了 finally 逻辑。

使用条件:资源类必须实现 AutoCloseable 接口(几乎所有标准库中的资源类都实现了)。

public void readFile() {// 在try后的括号中声明和初始化资源try (FileInputStream file = new FileInputStream("myfile.txt")) {// ... 使用文件} catch (IOException e) {e.printStackTrace();}// 无需显式调用 file.close(),编译器会自动生成代码在背后调用它
}

在这个例子中,当 try 块正常结束或发生异常时,file.close() 方法会被自动调用。这大大减少了模板代码,避免了人为错误,是现在首选的资源管理方式。

总结

概念

解释

finally 的作用

提供一个保证执行的代码块。

释放的资源

系统资源,如文件句柄、网络端口、数据库连接等。由开发者手动编写代码在 finally块中释(例如调用 close()方法)。

现代替代方案

try-with-resources语句(Java 7+),自动管理资源释放,本质是语法糖,底层依然依赖 finally机制。

所以,finally 释放的是那些稀缺的、需要显式关闭的、由操作系统或外部系统管理的资源

如果小假的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!

http://www.dtcms.com/a/564565.html

相关文章:

  • VsCode中终端无法运行前端命令
  • 【鸿蒙开发】鸿蒙 ArkTS 语言从零到一完整指南
  • 门户网站建设公司网页设计风格分类
  • 综合整理:pdf预览显示:你尝试预览的文件可能对你的计算机有害。如果你信任此文件以及其来源,请打开此文件以看其内容,如何解决以正常预览文件
  • 微服务拆分之SpringCloud
  • Unity与iOS原生交互开发入门篇 - iOS原生弹窗与回调
  • 企业网站推广在哪里办成免费crm推广网站
  • 本地的赣州网站建设网站访问量asp
  • 总局核名的办理条件
  • 不只是计算:昇腾算子开发中的内存管理艺术
  • 深入解析 Spring Boot 自动配置:原理、实践与进阶​
  • 【Unity卷轴特效实现、原理、与深度解析】
  • STM32 串口中断接收原理与实战详解:从配置到中断服务函数全流程解析
  • 【Linux系统】C/C++的调试器gdb/cgdb,从入门到精通
  • 从被搜索到被推荐:GEO重塑可见性逻辑
  • 如何为 Oracle 数据库配置 TLS/TCPS
  • 阿里云网站备案注销吗大数据做网站
  • pc网站做app京东湖北网站推广服务
  • 测试环境与正式环境同样的机器显示不同的网络问题
  • HTTP_HTTPS协议
  • Linux高效备份:tar与gzip完全指南
  • Java中的File类
  • 四、Linux设备驱动介绍
  • 视频生成模型发展历程:从GAN到Sora的技术革命之路
  • SQL之表的查改(下)
  • CV论文速递: 覆盖医学影像分析、视频理解与生成、3D场景理解与定位等方向! (10.27-10.31)
  • Redis(四):缓存击穿及其解决方案(SpringBoot+mybatis-plus)
  • 突破局域网限制,Websocket 服务远程访问cpolar新方案
  • 科普网站建设方案网站容易被百度收录
  • 深圳营销网站建设服务wordpress 语言选择器