##简介
在Java SE7中引入了try-with-resources语句,它在try中声明一个或多个资源的 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 以及后续的版本中, 你可以检索被抑制的异常;

可以在一个 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, 或者没有异常。

使用Java中的Try-With-Resource相关推荐

  1. java中 resource_Java中如何获取resource的源码分析

    java 中获取 resource一般通过getResource(),不管你是通过class还是classloader来调用, 首先我们来讲讲getResource(string name)这个nam ...

  2. Java 中的语法糖,真甜。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱.内部 ...

  3. Java中的等待/通知机制(wait/notify)

    为什么80%的码农都做不了架构师?>>>    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...

  4. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

  5. 一看你就懂,超详细java中的ClassLoader详解

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见.理解ClassL ...

  6. stmt在java中的应用_JDBC技术基础总结转载,非原创

    JDBC的全称是Java DataBase Connectivity,即Java数据库连接.它是一套行业标准的API,可以在Java应用程序中与关系型数据库建立连接,并执行相关操作,例如Oracle, ...

  7. Java中几个主流的数据库连接池

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  8. java中spring的注解_spring中的各种注解解析

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  9. Redis笔记(六):Java中使用Redis

    Java程序使用Redis 添加依赖包 Maven依赖方式 <dependency><groupId>redis.clients</groupId><arti ...

  10. java中多条件与不定条件查询

    java中多条件与不定条件查询 网站或各类管理系统都会用到搜索,会用到一个或多个不确定条件搜索,单条件搜索比较简单,有时候会有多个条件共同查询,如果系统中已经提供了相关的方法供你使用最好,像我做这老系 ...

最新文章

  1. 解题报告:简单瞎搞题(bitset的应用)
  2. spring事物管理(配置文件方式)
  3. NetBeans 8.0的五个新性能提示
  4. mysql+cast+0x_mysql cast与convert 函数的用法
  5. Java 9 新功能之 HTTP2 和 REPL
  6. oracle批量把小写转换成大写,oracle数据库批量将表名小写转大写
  7. C#LeetCode刷题-数组
  8. 任正非:5G也不是万能的,发展也需要一个过程
  9. 查找数组键名是否存在
  10. python学习之老男孩python全栈第九期_day009之初始函数初窥
  11. 计算机音乐 带你去旅行,带你去旅行(全乐器)
  12. SQL Server中的Datediff移植到Oracle计算有误解决方案
  13. 让你此生难成大器的七宗罪
  14. C# BackgroundWorker用法详解
  15. 指导CoVaR,基于Copula、GARCH、DCC、分位数回归、藤VineCopula
  16. python 让电脑发出声音代码,用python录制输出声音
  17. 2020滑铁卢大学计算机科学学费,官宣!2020加拿大高校学费与涨幅~
  18. linux下怎么玩模拟人生4,《模拟人生4》典藏版晶锥灯在非游戏状态下的使用图文教程...
  19. 德国制造和中国制造究竟不同在哪
  20. Class 'Qcloud\Sms\SmsSingleSender' not found

热门文章

  1. Linux远程批量工具mooon_ssh和mooon_upload使用示例
  2. 开源会议系统openmeetings安装
  3. Gstreamer编程
  4. 如何设置XMind思维导图线条
  5. 非常好用的轮播图插件
  6. oracle usehash,/*+use_hash(t1 t2)*/的神奇
  7. mysql将备份的数据导入_成功将MySQL的大型数据导入导出和备份(转载)
  8. 查询sql一个字段重复的数据mysql_sql查询按两个字段查询重复记录
  9. asp.net 拦截html,关于c#:如何在-ASPNET-Core-中实现全局异常拦截
  10. oracle内部错误排查,Oracle内部错误ORA-600:[1112]