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 theAutoCloseable
接口的子类可以重写close
方法的这个行为来抛出指定的异常,例如IOException
,
或者没有异常。
本文翻译自Oracle官方文档http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html,如有不正确的地方,敬请指正,谢谢!
分享到:
相关推荐
Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!
java虚拟机规范 Java SE7 java虚拟机规范 Java SE7 java虚拟机规范 Java SE7
Cs4BiAs3Se7: A Novel Bismuth-Selenoarsenate with Infinite [infin]1[BiAs3Se7]4- Chains Containing Two Different Anions, [AsSe3]3- and trans-[As2Se4]4- Cs4BiAs3Se7: A Novel Bismuth-Selenoarsenate with...
java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:...
win7系统文件替换器 win7系统文件替换器 win7系统文件替换器
Java SE7 语言规范手册,来自:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf
SE7ENSKY CMS插件原料药 pageBuilder: component: "@webiny/serverless-page-builder" inputs: ... plugins: - ... - "@se7ensky/webiny-api-page-builder-page-settings-additional" - "@se7ensky/webiny-api-page-...
于想了解 Java 虚拟机 的程序员来说,《Java 虚拟机规范》是必须阅读的,对于想深入了解 Java 语言细节的程序员, 阅读《Java 虚拟机规范》也有极大好处
Java SE 7 API文档。jdk7 API文档。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向...
OCP java SE7 Programmer II Certification Guide
OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803).rar
Cs4BiAs3Se7: A Novel Bismuth-Selenoarsenate with Infinite [infin]1[BiAs3Se7]4- Chains Containing Two Different Anions, [AsSe3]3- and trans-[As2Se4]4- Cs4BiAs3Se7: A Novel Bismuth-Selenoarsenate with...
虚拟机 Java 1.7 SE7
介绍了Java虚拟机的规范,可以挑选自己需要的章节进行读取。
Java Virtual Machine Specification Java SE 7 中文版 Java Virtual Machine Specification Java SE 7 中文版 Java虚拟机规范SE7
c2960s-universalk9-mz.122-55.SE7.bin
JAVA核心技术基于JAVA SE7的API内容进行讲解,对于掌握JAVA基础的同学来说,无疑是一本值得拥有的书,本书带目录,高清
虚拟机方面的权威著作 java虚拟机规范SE7,包含中文版和英文版
JAVA核心技术原书第9版,基本JAVA SE7底层API进行讲解,对于需要和想要提高自己JAVA技术的同学来说,不疑为一本好书,值得拥有
Se7en是一个基于基于Bootstrap3的,仿ios7风格的,完全响应式的后台框架,她内置了5套简单的皮肤模板,她还加入了近20个国外优秀的开源项目,并可简单组合与拆卸,她采用了全新的设计,最新的技术和最佳的行业实践结果,并...