0

0

在Java里如何使用finally来释放资源_Java异常后资源清理说明

P粉602998670

P粉602998670

发布时间:2026-02-25 15:39:11

|

158人浏览过

|

来源于php中文网

原创

finally块中close()不生效主因是close()自身可能抛异常导致原始异常被压制,或资源为null/已关闭引发npe/ise;应判空关闭、内层捕获异常、禁用return/throw;推荐try-with-resources自动管理autocloseable资源;非autocloseable资源需手动在finally中安全释放;finally不保证执行,jvm强制退出、线程被杀、死循环时会跳过。

在java里如何使用finally来释放资源_java异常后资源清理说明

finally 块里调用 close() 为什么有时不生效

因为 close() 方法本身可能抛出异常,如果 try 块已发生异常,而 finally 中又抛出新异常,原始异常会被压制(suppressed),且资源实际未关闭。更关键的是:如果 close() 调用前资源引用为 null 或已提前关闭,直接调用会触发 NullPointerExceptionIllegalStateException

实操建议:

  • 始终在 finally 中判空再关闭:if (resource != null) resource.close();
  • close() 放进内层 try-catch,避免干扰外层异常传播
  • 不要在 finally 中 return 或 throw,否则会吞掉 try/catch 的异常或返回值

Java 7+ 推荐用 try-with-resources 替代 finally

try-with-resources 是编译器支持的语法糖,自动调用实现了 AutoCloseable 接口的对象的 close() 方法,无论是否异常都会执行,且能正确处理多个资源的关闭顺序和异常压制。

使用场景:所有标准 I/O 类(FileInputStreamBufferedReader)、JDBC 类(ConnectionStatementResultSet)都实现了该接口。

立即学习Java免费学习笔记(深入)”;

示例:

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载
try (FileInputStream fis = new FileInputStream("a.txt");
     BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
    br.readLine();
} catch (IOException e) {
    // 异常在这里被捕获
}

注意:资源声明必须在 try 括号内,且按声明逆序关闭(后声明的先关)。

finally 中释放非 AutoCloseable 资源怎么办

比如手动分配的 native 内存(通过 Unsafe.allocateMemory)、自定义锁(ReentrantLock)、线程池(ExecutorService)等,不实现 AutoCloseable,无法用 try-with-resources。

实操建议:

  • ReentrantLock:必须在 finally 中调用 unlock(),且确保 lock 成功后再进 finally
  • ExecutorService:调用 shutdown() + awaitTermination(),但注意后者会阻塞,生产中常改用 shutdownNow() 配合超时判断
  • 对 native 资源:务必在 finally 中显式释放,并考虑用 Cleaner(Java 9+)作为兜底机制

finally 不是万能的——它不保证一定执行

绝大多数情况下 finally 会执行,但有三个明确例外:

  • JVM 进程被强制终止(如 System.exit(0)、kill -9)
  • 线程在 trycatch 中被杀死(Thread.stop(),已废弃但仍有影响)
  • 死循环或无限递归卡死在 try 块中,导致程序无法到达 finally

这意味着:关键清理逻辑(如解锁、回滚事务)不能只依赖 finally,必要时需结合超时、健康检查或外部监控机制。尤其在分布式或长时间运行的服务中,finally 的“一定执行”是个脆弱假设。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

398

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.10.07

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

886

2024.03.01

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.12.20

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

830

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1651

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

506

2025.10.17

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

65

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.1万人学习

Java 教程
Java 教程

共578课时 | 71.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号