使用try-with-resources语句替代try-finally语句

Java类库中包含许多必须通过调用close方法手动关闭的资源,例如InputStream、OutputStream和java.sql.Connection。 开发人员经常忽视关闭资源,其性能结果可想而知。

从以往来看,try-finally语句是保证资源正确关闭的最佳方式,即使是在程序抛出异常或返回的情况下:

static String firstLineOfFile(String path) throws IOException {BufferedReader br = new BufferedReader(new FileReader(path));try {return br.readLine();} finally {br.close();}
}

即使是用try-finally语句关闭资源的正确代码,如上述代码示例所示,这里也有一个微妙的缺陷。 例如在firstLineOfFile方法中,由于底层物理设备发生故障,对readLine方法的调用可能会引发异常,并且由于相同的原因,调用close方法可能会失败。另外如果try语句中有多个流在任务处理完以后,都需要关闭,那么这个finally中的方法处理就会变得复杂,需要在finally中写大量关闭连接、通道的代码,过于冗余。

当Java 7引入了try-with-resources语句时,上述问题得到了一定解决(自动关闭流和简化代码)。要使用这个构造,资源必须实现AutoCloseable 接口,该接口由一个返回为void的close组成。Java类库和第三方类库中的许多类和接口现在都实现或继承了AutoCloseable接口。如果你编写的类表示必须关闭的资源,那么这个类也应该实现AutoCloseable接口。

以下是我们使用try-with-resources语句对上述示例的改造:

static String firstLineOfFile(String path) throws IOException {try (BufferedReader br = new BufferedReader(new FileReader(path))) {return br.readLine();}
}

不仅try-with-resources版本比原始版本更精简,更好的可读性。可以在 try-with-resources 语句中添加 catch 子句,就像在常规的 try-finally 语句中一样。这允许你处理异常,而不会在另一层嵌套中污染代码。 

static String firstLineOfFile(String path, String defaultVal) {try (BufferedReader br = new BufferedReader(new FileReader(path))) {return br.readLine();}catch (Exception e){e.printStackTrace();}
}

总结:

  • 采用try-with-resources写法,当try中代码执行结束(正常结束/异常结束)之后就会调用try()括号中对象的close()方法来关闭资源,虽然表面上来看try-with-resources写法更加优雅,如果我们对try-with-resources语法代码进行反编译,可以看到里面仍然是try-catch-finally写法,所以说try-with-resources写法是一种语法糖写法。
  • 在处理必须关闭的资源时,使用try-with-resources语句替代try-finally语句。 生成的代码更简洁、更清晰,并且生成的异常更有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端的规划:深度解构与未来展望

Web前端的规划:深度解构与未来展望 在数字化浪潮汹涌的时代,Web前端作为用户与互联网世界的桥梁,其重要性不言而喻。对于前端开发者而言,一份精心规划的Web前端策略,不仅是项目成功的基石,更是技术进步的引…

Foundation Model 通用大模型的评测体系

随着大模型评测需求逐渐增加,相关研究也进一步深入。大模型相比传统模 型,泛化能力更强、灵活性更高、适应性更广,多任务、多场景,评测维度、评测指标和数 据集更复杂,面向大模型的评估方法、评测基准、测试集成为新的研究课题。 …

Qt图表类介绍

本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型:折线图,样条曲线图,面积图,散点图,条形图,饼图,方块胡须图,蜡烛图,极坐标图。 QCharts的图表框架类似…

数据Ant-Design-Vue动态表头并填充

Ant-Design-Vue是一款基于Vue.js的UI组件库,广泛应用于前端开发中。在Ant-Design-Vue中,提供了许多常用的组件,包括表格组件。表格组件可以方便地展示和处理大量的数据。 在实际的开发中,我们经常会遇到需要根据后台返回的数据动…

【Python】Selenium基础入门

Selenium基础入门 一、Selenium简介二、Selenium的安装三、Selenium的使用1.访问web网站2.元素定位根据标签 id 获取元素根据标签 name 属性的值获取元素根据 Xpath 语句获取元素根据标签名获取元素根据CSS选择器获取元素根据标签的文本获取元素(精确定位&#xff0…

“论边缘计算及应用”必过范文,突击2024软考高项论文

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的分布式开放平台(架构),就近提供边缘智能服务。边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在…

宝塔面板和 LNMP 环境下反代 HFish 蜜罐平台的正确方法

最近明月在热心站长好友的支持下搭建了安全、简单、有效并永久免费的蜜罐平台 HFish,因为 HFish 默认是以 https://IP:端口 的 Web 链接形式提供访问的,这会暴露蜜罐平台的真实服务器 IP 不说,还非常不便于快速的访问(反正明月是记不住 IP 的),所以就需要给部署好的 HFis…

OS复习笔记ch8-3

驻留集 驻留集:指请求分页存储管理中给进程分配的内存块的集合。 在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。 驻留集,从某种角度可以看成是进程可以常驻内存的内存块的集合。 若驻留集太小,会导致缺页频繁…

excel vlookup首行值不对

因为数据表查找区间不够大。行数要足够大。 好像和精确匹配有关

Windows 10 找不到Microsoft Edge 浏览器

下载链接 了解 Microsoft Edge 手动下载浏览器 问题说明 一般来说,windows10系统应该是自带浏览器edge的,但有的电脑就是没有找到edge浏览器,可能系统是精简过的,可能是被卸载了。如下,控制面板确实没找到程序。 ​ …

大模型相关:ChatGPT的原理与架构

一、大模型面临的挑战 1.1 Transformer模型的缺陷: 与RNN相比Transformer面临以下挑战: 并行计算能力不足。RNN需要按序处理序列数据中的每个时间步,这限制了它在训练过程中充分利用现代GPU的并行计算能力,从而影响训练效率。长…

【Vue3】shallowReactive() and shallowReadonly()

历史小剧场 所谓历史,就是过去的事,它的残酷之处在于:无论你哀嚎,悲伤,痛苦,落寞,追悔,它都无法改变。 一具有名的尸体躺在无数无名的尸体上,这就是所谓的霸业。---- 《明…

C#操作MySQL从入门到精通(18)——使用组合查询

前言: 我们有时候需要使用多条select语句来获取查询结果,这时候就可以使用union这个关键字来实现组合查询,详细介绍如下: 1、union union这个组合查询,会自动将重复的行去掉 使用union来组合两条select语句 string sql = string.Empty;if (radioButton_UNION.Checked){…

SQL主键回显

目录 一 业务场景 二 如何使用 一 业务场景 当我们在一个业务功能下操作多张表时,当另一个表数据需要上一个表刚插入的数据的ID时,就需要使用到主键回显。 比如我现在有两张表,一张是菜品表,一张是口味表。而我一个菜品应该会有多…

关于Input【type=number】可以输入e问题及解决方案

一、为什么 因为在数学里e 代表无理数,e是自然对数的底数,同时它又是一个无限不循环小数,所以我们在输入 e 时,输入框会默认 e 是数字,从而没有对它进行限制。 二、解决方案 小提示:vue下监听事件需要加n…

Llama模型家族之Stanford NLP ReFT源代码探索 (二)Intervention Layers层

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

simulink中显示模块中的名字

simulink/matlab version: R2022a 改动前:X那里没有显示名字; 改动方法: 1)鼠标左键点击待显示模块; 2)菜单栏新增 模块这个选项; 3)点击自动名称; 4) 点击名称打开…

Linux 内核参数-相关介绍

Linux 内核参数-相关介绍 今天,介绍Linux内核参数相关内容。由于Linux内核优化需要根据具体需求进行具体优化,同时需要具备一定经验,所以这里不涉及优化操作内容。 不过,遇到面试中有相关题目,不至于答不上来&#x…

leetcode-04-[24]两两交换链表中的节点[19]删除链表的倒数第N个节点[160]相交链表[142]环形链表II

一、[24]两两交换链表中的节点 重点:暂存节点 class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHeadnew ListNode(-1);dummyHead.nexthead;ListNode predummyHead;//重点:存节点while(pre.next!null&&pre.next.next…

LeetCode 第132场双周赛个人题解

100324. 清除数字 原题链接 100324. 清除数字 思路分析 一次遍历,相当于用栈进行括号匹配的压入弹出 时间复杂度O(n) AC代码 class Solution:def clearDigits(self, s: str) -> str:n len(s)res []cnt 0for x in s:if str.isdigit(x):res.pop()else:re…