Java SE7新特性之try-with-resources语句
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 statement try (
java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) { // Enumerate each entry for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) { // Get the entry name and write it to the output file String 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,如有不正确的地方,敬请指正,谢谢!
http://blog.csdn.net/jackiehff/article/details/17765909
Java SE7新特性之try-with-resources语句的更多相关文章
- IBM Developer:Java 9 新特性概述
Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...
- Java 8新特性解读
(四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...
- Java 8新特性-4 方法引用
对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法 ClassName :: staticMetho ...
- Spring 4支持的Java 8新特性一览
有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...
- java 8 新特性
最近在IDEA的️驱使下,看了点java8的东西,链接贴一下,,,,, 1.Java 8新特性概述2.Java 8中的 Stream API 详解[3.Java 8新特性终极指南] 简单的使用看完新特 ...
- Java 8 新特性终极版
声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...
- Java 8新特性前瞻
快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...
- Java 8新特性探究(八)精简的JRE详解
http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...
- Java 8 新特性1-函数式接口
Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; i ...
随机推荐
- Java使用泛型类来提高方法的可重用性
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3832268.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记
睡眠机制 我们活着的时候,大脑会产生脑电波.脑电图仪器通过贴在人头上的一些电极读出脑电波的活动,然后把活动用图表显示出来. 睡眠过程可以分为5个过程,划分依据与大脑发出的脑电波类型. 当人清醒时,大脑 ...
- thinkphp 前后版本ajaxReturn方法的分别
之前用的是thinkphp2的版本现在改到thinkphp3.2已上的版本,发现ajaxReturn这个方法返回的数据不一样了,现在做下记录 thinkphp2的ajaxReturn的实现原码 pro ...
- 登堂入室——java流
——文章出自PeterYe,不得私自转载 我所知道的 java.io里面的[流],就仿佛太平洋里面的水一样,浩浩荡荡,横无际涯... -----2016/7/16--------公寓处记录------ ...
- 【转】M0,M1,M2,M3,M4基本概念
在金融学中的M1,M2,M3,M4都是货币层次的划分M0= 流通中的现金;M1=M0+ 个人信用卡循环信用额度+ 银行借记卡活期存款+ 银行承兑汇票余额+ 企业可开列支票活期存款;M2=M1+ 个人非 ...
- 运用百度开放平台接口根据ip地址获取位置
使用百度开放平台接口根据ip地址获取位置 今天无意间发现在百度开放平台接口,就把一段代码拿了下来,有需要的可以试试看:http://opendata.baidu.com/api.php?query=5 ...
- Eclipse中propedit插件安装(解决property中文问题)
Eclipse Help--Install New Software... Add... propedit -- http://propedit.sourceforge.jp/eclipse/up ...
- GHOST中DISK TO DISK 和DISK FROM to image的区别
Ghost的Disk菜单下的子菜单项可以实现硬盘到硬盘的直接对拷(Disk-To Disk)、硬盘到镜像文件(Disk-To Image)、从镜像文件还原硬盘内容(Disk-From Image)。 ...
- 十九、mysql 数据分布式
1.RAID 廉价磁盘冗余阵列 2.Symbolic links 通俗易懂的说就是通过连接符指向的操作,人为的将某些数据库分布到其他的文件夹/磁盘上 Linux: Mysql DATA路径:/opt/ ...
- Unity3d + UGUI 的多分辨率适配
原文地址:http://blog.csdn.net/dingkun520wy/article/details/49471789 1.Canvas的属性配置 2.Canvas Scaler的属性配置 3 ...