在单个try-with-resources语句中仔细指定多个资源

Java 7更有用的新功能之一是引入了try-with-resources语句 [AKA 自动资源管理 ( ARM )]。 try-with-resources语句的吸引力在于其承诺 “确保在语句末尾关闭每个资源”。 在这种情况下,“资源”是实现AutoCloseable及其close()方法并在try-with-resources语句的“ try”子句中实例化的任何类。

Java语言规范 [JLS]在14.20.3节 (在这种情况下为Java SE 10 JLS )中详细描述了try-with-resource语句 。 JLS声明“ try -with-resources语句是使用局部变量(称为resources )进行参数化的,这些局部变量在try块执行之前被初始化,并在执行try之后以与初始化时相反的顺序自动关闭。块。”

JLS明确指定可以相对于单个try -with-resources语句定义多个资源,并且它指定如何指定多个资源。 具体地说,它表明try可以跟随一个“ ResourceSpecification ,其由一个”的“ ResourceList ,其由一个或多个“的” 资源 “秒。 当声明的资源多于一个时,多个资源用分号( ; )分隔。 用分号分隔的列表指定多个资源很重要,因为try -with-resources语句将不支持(不会自动关闭)未以此方式声明的任何候选资源。

try -with-resources语句中指定多个资源时,最有可能的错误源是“嵌套”“资源”的实例化,而不是显式地实例化每个变量的局部变量,而在每个实例化之间不使用分号。 以下示例将说明差异。

接下来显示两个荒谬但说明性的类。 每个类都实现AutoCloseable ,因此可以与try -with-resources结合使用,并且在与try -with-resources语句正确使用时将自动调用其close()方法。 命名它们以反映可以使用InnerResource的实例实例化OuterResource

InnerResource.java

package dustin.examples.exceptions;import static java.lang.System.out;public class InnerResource implements AutoCloseable
{public InnerResource(){out.println("InnerResource created.");}public InnerResource(final RuntimeException exceptionToThrow){throw  exceptionToThrow != null? exceptionToThrow: new RuntimeException("InnerResource: No exception provided.");}@Overridepublic void close() throws Exception{out.println("InnerResource closed.");}@Overridepublic String toString(){return "InnerResource";}
}

OuterResource.java

package dustin.examples.exceptions;import static java.lang.System.out;public class OuterResource implements AutoCloseable
{private final InnerResource wrappedInnerResource;public OuterResource(final InnerResource newInnerResource){out.println("OuterResource created.");wrappedInnerResource = newInnerResource;}public OuterResource(final InnerResource newInnerResource,final RuntimeException exceptionToThrow){wrappedInnerResource = newInnerResource;throw  exceptionToThrow != null? exceptionToThrow: new RuntimeException("OuterResource: No exception provided.");}@Overridepublic void close() throws Exception{out.println("OuterResource closed.");}@Overridepublic String toString(){return "OuterResource";}
}

现在,可以使用刚刚定义的两个类来演示在用分号分隔的列表中的同一try -with-resources语句中正确声明每个实例的实例与在外部资源的构造函数中错误地嵌套内部资源的实例之间的区别。 后一种方法效果不理想,因为就调用其AutoCloseable.close()方法而言,没有本地定义变量的内部资源不会被视为“资源”。

下一个代码清单演示了在try -with-resources语句中实例化“资源”的错误方法。

try -with-resources语句中实例化资源的错误方法

try (OuterResource outer = new OuterResource(new InnerResource(), new RuntimeException("OUTER")))
{out.println(outer);
}
catch (Exception exception)
{out.println("ERROR: " + exception);
}

执行上面的代码后,输出“ InnerResource created”。 可以看到,但是从未显示与资源关闭相关的输出。 这是因为InnerResource的实例是在对OuterResource类的构造函数的调用中实例化的,并且从未在try -with-resource语句的资源列表中分配给自己的单独变量。 对于真正的资源,这意味着资源没有正确关闭。

下一个代码清单演示了在try -with-resources语句中实例化“资源”的正确方法。

try -with-resources语句中实例化资源的正确方法

try(InnerResource inner = new InnerResource();OuterResource outer = new OuterResource(inner, new RuntimeException("OUTER")))
{out.println(outer);
}
catch (Exception exception)
{out.println("ERROR: " + exception);
}

当执行上面紧接的代码时,输​​出将同时包含“ InnerResource created”。 并且“ InnerResource已关闭。” 因为InnerResource实例已在try -with-resources语句中正确分配给变量,所以即使实例化期间发生异常,也将正确调用其close()方法。

Java教程的try-with-resources语句部分包括几个示例,这些示例正确地将try -with-resources中的资源指定为以分号分隔的单个变量定义。 一个示例通过java.util.zip.ZipFile和java.io.BufferedWriter展示了这种正确的方法,而另一个示例通过java.sql.Statement和java.sql.ResultSet的实例展示了这种正确的方法。

在JDK 7中引入try -with-resources是对该语言的一种受欢迎的补充,它使Java开发人员可以更轻松地编写不太可能泄漏或浪费资源的资源安全的应用程序。 但是,当在单个try -with-resources语句中声明多个资源时,重要的是要确保每个资源都单独实例化并分配给在try的资源说明符列表中声明的自己的变量,以确保每个资源都是正确关闭。 一种快速的检查方法是确保对于try指定的n个 AutoCloseable实现资源,应该有n-1个分号来分隔这些实例化的资源。

翻译自: https://www.javacodegeeks.com/2018/08/carefully-specify-multiple-resources.html

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

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

相关文章

两轮差速机器人舵机转轴示意图_机器人教程2:舵机及转向控制原理

图3舵机外形图2、舵机的组成一般来讲,舵机主要由以下几个部分组成,舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等,如图4、图5所示。图4舵机的组成示意图图5舵机组成舵机的输入线共有三条,如图6所示,红色中间…

label标签 html5,HTML5 label 标签

实例HTML5 标签用于为 input 元素做出标记。带有两个输入字段和相关标记的简单 HTML 表单:MaleFemale尝试一下 浏览器支持目前大多数浏览器支持 标签。标签定义及使用说明标签为 input 元素定义标注(标记)。label 元素不会向用户呈现任何特殊效果。不过,…

me shy是什么歌 抖音make_抖音星河滚烫你是人间的理想下一句是什么歌 星河歌词完整版...

最近在抖音上听到一段话,这段话的开头是“星河滚烫,你是人间的理想……”。抖音星河滚烫你是人间的理想下一句是什么歌?星河歌词介绍?星河,是非常好听的一首歌曲,是很多人都喜欢的一首歌曲。抖音星河滚烫你…

修改使用计算机的名称,Windows 10中修改计算机名称的方法,你知道几种?

当用户新入手一台电脑时,通常做的第一件事就是做一些个性化设置。一般来说个性化的第一步就是给计算机起一个自己满意的名字,下面介绍几种修改计算机名字的方法。通过设置更改计算机名字按WinI键进入设置,在设置窗口中找到“系统”,点击它。在…

apollo 参数传递_使用Apollo通过WebSocket通过STOMP轻松进行消息传递

apollo 参数传递在我以前的文章中,我介绍了几个有趣的用例,这些用例使用著名的消息代理HornetQ和ActiveMQ通过Websockects实现STOMP消息传递。 但是我没有介绍的是Apollo,因为我个人认为它的API是冗长的,并且不像Java开发人员那样…

mysql不能改编码_(转)MySQL设置和修改编码问题

mysql版本:5.7.18一、常用查看字符集设定命令1、查看数据库支持的所有字符集。show character set;(或 show char set;)2、查看当前状态命令(显示结果会包含数据库的字符集设置)status(或 /s)其中Db characterset对应的是数据库目录下的db.opt文件内容。(查到mysql安…

python 编程语言排行榜_2019年6月编程语言排行榜:Python 排名飙升,三年内有望超越Java...

TIOBE 6 月编程语言排行榜 更新已发布,排名前三的依然是:Java, C, Python。本月Python的TIOBE指数再次创下8.5%的历史新高。如果Python能够保持这样的速度,那它完全有可能在3到4年内取代C和Java,从而成为世界上***的编程语言。Pyt…

使用IntelliJ调试Java流

流功能非常强大,只需几行就可以捕获您预期功能的要点。 但是,就像它们在一切正常工作时一样平滑,就像它们在表现不正常时一样令人痛苦。 了解如何使用IntelliJ调试Java Streams并深入了解Stream的中间操作。 在本文中,我将在示例…

四川对口高职本科学校计算机,2018四川对口高职本科学校有哪些

相信很多想要报考四川单招对口高职的同学,都是非常的关心四川对口高职本科学校有哪些的,小编整理了相关信息,希望会对大家有所帮助!四川文化艺术学院(Sichuan University of Culture and Arts),简称“川文艺”,是经教育…

echart 饼图每一块间隙_花10分钟做酱香饼,简单方便又美味,酥脆咸香比买的还要好吃...

花10分钟做酱香饼,简单方便又美味,酥脆咸香比买的还要好吃前几年,在单位附近有一家只做酱香饼的小店,刚开张的时候排很长队,我为了一块酱香饼排队半小时。后来买酱香饼的人少了,我三天两头买一块酱香饼解馋…

html 边框轮廓,CSS半圈(边框,仅轮廓)

小编典典您可以使用border-top-left-radius和border-top-right- radius属性根据框的高度(和添加的边框)在框上四角。然后在框的顶部/右侧/左侧添加边框以达到效果。干得好:.half-circle {width: 200px;height: 100px; /* as the half of the width */background-col…

人类一败涂地做图教程_《人类一败涂地》形象绘画技巧图文指南

第2页:展开第四步进行对人物细节描边处理,使粗细不同的变得一致,还是拉近镜头,利用底色扣细致。最重要的一点来了!不管你画成什么样子,如果你在护理细节的过程中镜头过于拉进并且没有某一部位时模型会变成黑…

Spring Data Pivotal Gemfire教程

1. Spring Data Pivotal Gemfire –简介 在这篇文章中,我们将介绍有关Spring Data Pivotal Gemfire的全面教程。 Pivotal Gemfire是由Apache Geode支持的内存中数据网格解决方案。 使用Pivotal Gemfire构建的应用程序使您可以在分布式服务器节点之间轻松扩展系统。 …

计算机诞生发展分类特点及应用,计算机的诞生与发展,及其特点

计算机基本常识一、计算机的概念:计算机是一种能迅速而高效的自动完成信息处理的电子设备,它能按照程序对信息进行加工、处理、存储。二、计算机的诞生与发展1、诞生:1946年,美国为计算弹道轨迹而研制成功了世界第一台计算机。2、…

404 单页应用 报错 路由_通过 Laravel 创建一个 Vue 单页面应用(五)

文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34858我们在第4部分完成了编辑用户的功能,并且学习了如何使用 v-model 来监听视图组件中用户信息的更改。现在我们可以开始构思删除用户功能,以及删除…

使用计算机求解雷达方程,关于雷达方程

满意答案zjit99402014.01.27采纳率:41% 等级:12已帮助:2803人带宽校正系数是Co而不是Do.我们知道雷达接收到回波信号后,必须进行信号处理,使中频接收机的输出端(检波器的输入端)输出的信号和噪声功率比(简称信噪比)…

hook 与aspectj_将AspectJ与NetBeans平台开发集成

hook 与aspectj您是否正在使用NetBeans平台开发项目? 您愿意使用AspectJ来使用AOP吗? 您不知道如何将AspectJ编译器集成到NetBeans的内部版本中? 如果您的回答是“是”,则此帖子适合您。 我决定写这篇技术文章,是因为…

考试用计算机反思800字,考试反思作文800字

【考试】作者: 武佳硕2017年 5月6日 星期六 晴今天我们进行了一场在英华初中免费生考试前测试。虽然这次考试,不会算我们的真实成绩,但是老师要测我们的考试状态,一开始我还自信满满地认为我能考好,没想到我居然靠得一…

静茹docker容器的几种方法_1-容器和docker基础知识

[TOC]## 一 容器的概念### 1.什么是容器:容器是在隔离的环境里面运行的一个进程,这个隔离的环境有自己的系统目录文件,有自己的ip地址,主机名等。也可以说:容器是一种轻量级虚拟化的技术。### 2.容器相对于kvm虚拟机的…

JSON-B非对称属性绑定

JSON-B规范定义了诸如JsonbProperty或JsonbTransient类的绑定批注,以声明方式将Java对象映射到JSON,然后再映射回JSON。 这些注释可以“非对称地”用于定义序列化和反序列化的不同处理。 如果在Java属性上或在getter和setter上标注JSON Binding批注&…