在 JDK 9 中更简洁使用 try-with-resources 语句

本文详细介绍了自 JDK 7 引入的 try-with-resources 语句的原理和用法,以及介绍了 JDK 9 对 try-with-resources 的改进,使得用户可以更加方便、简洁的使用 try-with-resources 语句。

在 JDK 7 之前,资源需要手动关闭。

例如下面一个很常见的文件操作的例子:

Charset charset = Charset.forName("US-ASCII");
String s = ...;
BufferedWriter writer = null;
try {
    writer = Files.newBufferedWriter(file, charset);
    writer.write(s, 0, s.length());
} catch (IOException x) {
    System.err.format("IOException: %s%n", x);
} finally {
    if (writer != null) writer.close();
}

在 JDK 7 之前,你一定要牢记在 finally 中执行 close 以释放资源

JDK 7 中的 try-with-resources 介绍

try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。

例如,我们自定义一个资源类

public class Demo {
    public static void main(String[] args) {
        try(Resource res = new Resource()) {
            res.doSome();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

class Resource implements AutoCloseable {
    void doSome() {
        System.out.println("do something");
    }
    @Override
    public void close() throws Exception {
        System.out.println("resource is closed");
    }
}

执行输出如下:

do something
resource is closed

可以看到,资源终止被自动关闭了。

再来看一个例子,是同时关闭多个资源的情况:

public class Main2 {
    public static void main(String[] args) {
        try(ResourceSome some = new ResourceSome();
             ResourceOther other = new ResourceOther()) {
            some.doSome();
            other.doOther();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

class ResourceSome implements AutoCloseable {
    void doSome() {
        System.out.println("do something");
    }
    @Override
    public void close() throws Exception {
        System.out.println("some resource is closed");
    }
}

class ResourceOther implements AutoCloseable {
    void doOther() {
        System.out.println("do other things");
    }
    @Override
    public void close() throws Exception {
        System.out.println("other resource is closed");
    }
}

最终输出为:

do something
do other things
other resource is closed
some resource is closed

在 try 语句中越是最后使用的资源,越是最早被关闭。

try-with-resources 在 JDK 9 中的改进

作为 Milling Project Coin 的一部分, try-with-resources 声明在 JDK 9 已得到改进。如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。

例如,给定资源的声明

// A final resource
final Resource resource1 = new Resource("resource1");
// An effectively final resource
Resource resource2 = new Resource("resource2");

老方法编写代码来管理这些资源是类似的:

// Original try-with-resources statement from JDK 7 or 8
try (Resource r1 = resource1;
     Resource r2 = resource2) {
    // Use of resource1 and resource 2 through r1 and r2.
}

而新方法可以是

// New and improved try-with-resources statement in JDK 9
try (resource1;
     resource2) {
    // Use of resource1 and resource 2.
}

看上去简洁很多吧。对 Java 未来的发展信心满满。

愿意尝试 JDK 9 这种新语言特性的可以下载使用 JDK 9 快照。Enjoy!

源码

本章例子的源码,可以在 https://github.com/waylau/essential-java 中 com.waylau.essentialjava.exception.trywithresources 包下找到。

参考

from: https://waylau.com/concise-try-with-resources-jdk9/

原文地址:https://www.cnblogs.com/GarfieldEr007/p/10211553.html

时间: 2024-11-13 09:49:40

在 JDK 9 中更简洁使用 try-with-resources 语句的相关文章

Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 ——synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个重

Nashorn 在JDK 8中融合Java与JavaScript之力

从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java.此外,它还提供了使用jrunscript从命令行运行JavaScript的能力.如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了. 从JDK 8开始,Nashorn取代Rhino成为Java的嵌入式JavaScript引擎.Nashorn完全支

Nashorn——在JDK 8中融合Java与JavaScript之力--转

原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java.此外,它还提供了使用jrunscript从命令行运行JavaScript的能力.如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了. 从JDK 8开始,N

Nashorn——在JDK 8中融合Java与JavaScript之力

从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java.此外,它还提供了使用jrunscript从命令行运行JavaScript的能力.如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了. 从JDK 8开始,Nashorn取代Rhino成为Java的嵌入式JavaScript引擎.Nashorn完全支

wordpress去掉category怎么操作让url更简洁友好

用wordpress建站是比较流行的,全球将近25%的站点是用wordpress搭建的.有很多的模板.插件可以选择,当然最好还是能自己优化.URL固定链接就是之中一个基础的技巧.有网友问如何去掉url中的category,层级太多不太友好.可以根据ytkah设置,在[可选] 中的[分类目录前缀]那边填一个英文状态下的[.],文章的[自定义结构]可以设置为[/%category%/%post_id%.html],需要注意的是,做完这些操作一定要将之前的url重定向到新的网址,不然会出现很多的404

给微信图文消息添加修饰方框更简洁大方

我们在编辑微信公众号的时候,如果篇幅比较长,或者要点比较多,可以用方框分几个小版块,用户浏览更明了,排版美观许多,也不会给人一种长篇大论的感觉,一眼瞄过去就不想往下看,如下图的布局是不是更清爽一些呢? 想要这样的效果?直接复制下面的两小块就行了,文字自行修改.开始复制! 微信号 [微信号:xmyanke](←长按复制) 想知道日常生活中如何护眼吗?…… 如果要更多的样式,可以查看源代码,不懂代码没关系,修改具体的颜色值就够了,类似这种的color: #3e3e3e;,改一下就知道哪些是定义底部颜

Ext4.2之Grid扩展,扩展选择策略,自动设置分页组件,让Grid使用更简洁

1.概述: 在Ext项目开发中,Grid是用的最多的组件之一,在使用过程中发现很多的配置都是类似的,在此对Grid做个简单的封装. 任务1.在grid工具栏中经常会有新增.编辑.删除等操作,我们希望当用户选择一条记录时编辑和删除均可点击,当选择多条记录是删除可点击,编辑被禁用,当不选择时,编辑和删除均不可用,一般这些工作都在Controller中增加selectionchange事件和render事件来完成,这样做太繁琐,工作量大,在这里更简洁的解决方案是给grid增加两个选择属性,single

更简洁的 CSS 清理浮动方式

CSS清理浮动有很多种方式,像使用 br 标签自带的 clear 属,使用元素的 overflow,使用空标签来设置 clear:both 等等.但考虑到兼容问题和语义化的问题,一般我们都会使用如下代码来清理浮动. /* 清理浮动 */ .clearfix:after { visibility:hidden; display:block; font-size:0; content:" "; clear:both; height:0; } .clearfix { zoom:1; } 其原

去掉CSS赘余代码,CSS可以更简洁

本篇文章适合css新手学习,对于已经掌握了css的朋友们也可以通过本片文章来复习知识. 作者通过实践,认为在有些情况下css的代码是可以更加简洁的,多数情况下是因为新手对于一些具有多属性的元素代码不能精简来写造成的. 精简的代码对于网页是有莫大的好处的,对于浏览者访问速度会有一定的提升,另外对于搜索引擎也更加可以抓取网页关键内容.废话不说了,下面就看看笔者总结的可以精简的代码: 1.Margin & Padding 例1: .div { margin-top:10px; margin-right