finally 释放的是什么资源?

2025-12-12 0 314

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 释放的是那些稀缺的、需要显式关闭的、由操作系统或外部系统管理的资源

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 finally 释放的是什么资源? https://www.zuozi.net/35816.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务