Java SE 7 中带资源声明的 try 语句(try-with-resources statement)
2016-02-05 11:35
477 查看
try-with-resources statement 是指声明了一个或多个资源的
try-with-resources 语句用法:在
这里的
在上例中,如果
在 try-with-resources 语句中,也可以声明多个资源,各资源声明语句用分号隔开:
当从
最後,try-with-resources 语句可以像Java SE 7 之前的普通
try语句(statement,声明),其中的资源一般是指在程序执行完毕後需要关闭(close)的对象,而 try-with-resources 语句中声明的资源会在
try块执行完毕後自动关闭。try-with-resources 语句中的资源只能为实现了
java.lang.AutoCloseable接口的类实例,但是 Java SE 7 之後的所有实现了java.io.Closeable的类都实现了
java.lang.AutoCloseable接口(该接口是在Java SE 7中才引入的),故都可以作为这里的资源。
try-with-resources 语句用法:在
try关键字後面伴随一对小括号,并在括号中声明
try块中要用到的资源。下例中利用
BufferedReader来读取文件中的第一行,采用了 try-with-resources 的语法:
static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
这里的
BufferedReader对象不必调用其
close()方法进行关闭,而是会在退出
try块(不论正常或异常退出)後自动关闭(後台会自动调用
close()),释放资源。按 Java SE 7 之前的写法,
BufferedReader对象一般需要在
try块後面的
finally块中调用其
close()方法关闭对象:
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()方法先後都产生了异常,那么在用
finally块关闭
BufferedReader对象时,由
readLine()方法产生的(第一个)异常会被抑制(suppressed),只有
close()产生的(第二个)异常会被向上传递;相反,若用 try-with-resources 语句的话,则只有
try块中产生的异常被向上传递(这个异常的信息通常更有用),try-with-resources 语句中产生的异常则会被抑制。当然,在Java SE 7之後,被抑制的异常可以通过调用
Throwable.getSuppressed()方法获取。
在 try-with-resources 语句中,也可以声明多个资源,各资源声明语句用分号隔开:
try ( ZipFile zf = new ZipFile(zipFileName); BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset) ) { // Enumerate each entry }
当从
try块中(以正常或异常方式)退出时,在 try-with-resources 语句中所声明资源的关闭方法都会被自动调用,并且是按与资源声明序相反的顺序调用其
close()方法的。
最後,try-with-resources 语句可以像Java SE 7 之前的普通
try语句一样带有
catch块和
finally块,但在执行
catch块(若有必要)和
finally块中的代码前,会先关闭 try-with-resources 语句中声明的资源。
参考资料:
The try-with-resources Statement (The Java™ Tutorials > Essential Classes > Exceptions)相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序