jdk7之后,引入了try-with-resources ,try-with-resources语句是一个声明一个或多个资源的try语句。一个资源作为一个对象,必须在程序结束之后关闭。try-with-resources语句确保在语句的最后每个资源都被关闭,任何实现了java.lang.AutoCloseable和java.io.Closeable的对象都可以使用try-with-resource来实现异常处理和关闭资源。
其实就是在try-catch-finally的简写,不用在finally里面写关闭的处理语句了,自动关闭。
优点:
1.代码精炼,在JDK1.7之前都有finally块,关闭、处理、回收资源,引入try-with-resource以后的版本只要资源类实现了AutoCloseable或Closeable程序在执行完try块后会自动close所使用的资源无论是否抛出异常。
2.代码更完全。在出现资源泄漏的程序中,很多情况是开发人员没有或者开发人员没有正确的关闭资源所导致的。JDK1.7之后采用try-with-resources的方式,则可以将资源关闭这种与业务实现没有很大直接关系的工作交给JVM完成。省去了部分开发中可能出现的代码风险。
异常抛出顺序
在JDK1.7之前如果try{}里面的语句与finally{}语句关闭资源时都抛出异常,
则只会抛出finally块中的异常,不会抛出try{}中的异常,这样经常会导致得到的异常信息不是调用程序想要得到的。
在JDK1.7及以后采用了try-with-resource机制,如果在try-with-resource声明中抛出异常(如文件无法打开或无法关闭)的同时try(){}大括号内语句也抛出异常,则只会抛出try(){}大括号内语句的异常。
try声明资源时,可以声明一个资源,也可以同时声明多个资源
- public class AboveJDK7_2 {
- 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);
- //打开zip文件,创建输出流
- try (
- java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
- java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(
- outputFilePath, charset)
- )
- {//遍历文件写入txt
- XXXXXXXXXXXXXX
- }
- }
- }
- 注:上面的例子,无论正常执行还是有异常抛出,zf和write都会被执行close()方法,不过需要注意的是在JVM里调用的顺序是与生命的顺序相反。在JVM中调用的顺讯为:
writer.close();
zf.close();
所以在使用时一定要注意资源关闭的顺序。
catch多种异常并抛出新的异常
- try(xxxxxxx){
- //逻辑代码
- }catch (IOException | SQLException ex) {
- logger.log(ex);
- throw new SpecialException();
- }