try-with-resources语句是一个声明一个或多个资源的 try 语句。一个资源作为一个对象,必须在程序结束之后随之关闭。 try-with-resources语句确保在语句的最后每个资源都被关闭 。任何实现了 java.lang.AutoCloseable的对象, 包括所有实现了 java.io.Closeable 的对象, 都可以用作一个资源。

下面的例子读取文件的第一行。它使用了 BufferedReader 的一个实例来读取文件中的数据。BufferedReader 是一个资源,它必须在程序结束之后随之关闭:

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

在这个例子中, try-with-resources 语句声明的资源是一个 BufferedReader。声明语句在紧跟在 try 关键字的括号里面。Java SE 7以及后续版本中,BufferedReader类实现了java.lang.AutoCloseable接口。 因为 BufferedReader 实例是在 try-with-resource 语句中声明的, 所以不管 try 语句正常地完成或是 发生意外 (结果就是 BufferedReader.readLine 方法抛出IOException),BufferedReader都将会关闭。

在 Java SE 7之前, 可以使用 finally 块来确保资源被关闭,不管 try 语句正常地完成或是发生意外。下面的例子使用 finally 块替换 try-with-resources 语句:

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

然而,在这个例子中,如果 readLine 和 close 方法均抛出异常,那么 readFirstLineFromFileWithFinallyBlock 方法将抛出从 finally 块中抛出的异常;  try 块中抛出的异常被抑制了。与此相反, 在 readFirstLineFromFile 这个例子中, 如果 try 块和 try-with-resources 语句均抛出异常, 那么 readFirstLineFromFile 将抛出从 try 块中抛出的异常;  try-with-resources 块抛出的异常被抑制了。在Java SE 7 以及后续的版本中, 你可以检索被抑制的异常;详情参见 Suppressed Exceptions。

 可以在一个 try-with-resources 语句中声明一个或多个资源。下面的例子检索zip文件 zipFileName 中所有文件的名称并创建一个包含那些文件名称的文本文件:

    public static void writeToFileZipFileContents(String zipFileName, String outputFileName)throws java.io.IOException {java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);// Open zip file and create output file with try-with-resources statementtry (java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)) {// Enumerate each entryfor (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {// Get the entry name and write it to the output fileString newLine = System.getProperty("line.separator");String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;writer.write(zipEntryName, 0, zipEntryName.length());}}}

在这个例子中, try-with-resources 语句包含两个由分号隔开的声明: ZipFile 和 BufferedWriter。当代码块直接伴随着它正常地或由于一个异常终止时, BufferedWriter 和 ZipFile 对象的 close 方法以这种顺序自动地调用 。注意:资源的 close 方法调用顺序与它们的创建顺序相反。

下面的例子使用一个 try-with-resources 语句来自动关闭一个 java.sql.Statement 对象:

    public static void viewTable(Connection con) throws SQLException {String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";try (Statement stmt = con.createStatement()) {ResultSet rs = stmt.executeQuery(query);while (rs.next()) {String coffeeName = rs.getString("COF_NAME");int supplierID = rs.getInt("SUP_ID");float price = rs.getFloat("PRICE");int sales = rs.getInt("SALES");int total = rs.getInt("TOTAL");System.out.println(coffeeName + ", " + supplierID + ", " + price +", " + sales + ", " + total);}} catch (SQLException e) {JDBCTutorialUtilities.printSQLException(e);}}

这个例子中使用的 java.sql.Statement 这个资源是JDBC 4.1以及后续版本API的一部分。

       注意: 一个 try-with-resources 语句可以像普通的 try 语句那样有 catch 和 finally 块。在try-with-resources 语句中, 任意的 catch 或者 finally 块都是在声明的资源被关闭以后才运行。

被抑制的异常

与 try-with-resources 语句关联的代码块可能会抛出异常。在 writeToFileZipFileContents这个例子中,  当试图关闭 ZipFile 和 BufferedWriter 对象时,try 块可能会抛出一个异常,并且 try-with-resources 语句可能抛出多达两个异常 。如果 try 块抛出异常并且 try-with-resources 语句抛出一个或多个异常,那么从 try-with-resources 语句中抛出的异常将会被抑制, 并且块抛出的异常是由 writeToFileZipFileContents 方法抛出的那一个。你可以通过调用由 try块抛出的异常的Throwable.getSuppressed 方法检索这些被抑制的异常信息

实现了AutoCloseable 或 Closeable 接口的类

参见 AutoCloseable 和 Closeable 接口的Javadoc可以看到实现了两者当中的任何一个接口的类集Closeable 接口继承了 AutoCloseable 接口。 Closeable接口的 close 方法抛出IOException 类型的异常而 AutoCloseable 接口的 close 方法抛出 Exception 类型的异常因此, subclasses of the AutoCloseable 接口的子类可以重写 close 方法的这个行为来抛出指定的异常,例如 IOException, 或者没有异常。

本文翻译自Oracle官方文档http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html,如有不正确的地方,敬请指正,谢谢!

from: https://blog.csdn.net/jackiehff/article/details/17765909

Java SE7新特性之try-with-resources语句相关推荐

  1. Java SE7新特性之泛型实例创建时的类型推断

    Java SE7新特性之泛型实例创建时的类型推断 标签: JDK7泛型 2014-01-04 15:34 6015人阅读 评论(0) 收藏 举报  分类: Java基础(9)  只要编译器从上下文中能 ...

  2. Java SE7新特性之switch语句中使用字符串

    2019独角兽企业重金招聘Python工程师标准>>> 在JDK 7发布版本中, 可以在switch语句的表达式中使用String对象: public String getTypeO ...

  3. java se7 新特性_Java SE7新特性之try-with-resources语句

    try-with-resources语句是一个声明一个或多个资源的 try 语句.一个资源作为一个对象,必须在程序结束之后随之关闭. try-with-resources语句确保在语句的最后每个资源都 ...

  4. Java 9 新特性概述

    转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...

  5. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  6. Java 11 新特性

    2019独角兽企业重金招聘Python工程师标准>>> Java 11 新特性 转载于:https://my.oschina.net/u/3764794/blog/2993127

  7. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  8. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  9. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

最新文章

  1. js中关于this的小问题
  2. 谈谈自己的理解:python中闭包,闭包的实质
  3. springboot jwt token前后端分离_为什么要 前后端分离 ?
  4. 关于关闭SELinux的方法
  5. Matlab编程学习笔记【待续】
  6. 构建前端Mock Server的利器/Json-Server
  7. C++ 获取类成员虚函数地址
  8. Flutter 技术介绍
  9. java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别
  10. kali利用fluxion无线网络钓鱼
  11. Web视频上添加文字
  12. 《大秦赋》热血霸气台词场景记录
  13. 网页打开慢,甚至突然打不开?图片刷新不出来?多半是DNS的问题!
  14. Linux下安装gitea
  15. python 会计分录模板_常见会计分录大全(15种小企业模板)
  16. NYOJ - 找点【贪心】
  17. api工厂接口路径是什么_为什么(几乎)永远不要再使用绝对路径访问API
  18. c++中的构造数据类型----结构体
  19. 判断一个年份是否是闰年
  20. 电子计算机是汉字的掘墓人,当人类社会进入到信息时代,曾有人_______,计算机是方块汉字的掘墓人。然 - 问答库...

热门文章

  1. Distributed locks with Redis--官方
  2. rabbitmq Clustering Guide--官方
  3. 清除linux缓存命令
  4. jquery学习手记(10)事件简介
  5. 特斯拉马斯克直聘AI人才:不看学历看能力
  6. BM算法的shift1表是在所有情况下移动都是最快的吗?
  7. Apache ZooKeeper - Leader Election使用场景
  8. Redis进阶-布隆过滤器
  9. Android Studio使用外部jar包
  10. c语言 1 2是什么类型,C语言2-C数据类型(1).docx