java带资源的try语句

 jdk 1.7之后出现的一个新的语句,主要用于关闭资源。所谓资源,就是一个流,一个连接,一个数据库连接等。

     在原来关闭资源的时候,用 try-catch-finally 时如果try中的代码跑出了一个非 IOException,在执行finally调用close方法时close方法本身也会有可能抛出 IOException 异常。这种情况下,原始的异常将丢失,转而抛出close方法的异常。

     在jkd 1.7之前的处理方法较为繁琐,如下:

    package why;  
      
    import java.io.FileInputStream;  
    import java.io.InputStream;  
      
    public class Advice {  
          
        public static void main(String[] args) {  
            InputStream in = null;  
            Exception ex = null;  
            try{  
                try{  
                    //code…..;  
                } catch (Exception e) {  
                    ex = e;  
                    throw e;  
                }  
            } finally {  
                try {  
                    in.close();  
                } catch (Exception e) {  
                    if(ex == null)   
                        throw e;  
                }  
            }  
        }  
    }  

     在jdk 1.7之后出现了带资源的try语句,它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源(此处的资源是指那些必须在程序结束时显式关闭的资源,比如数据库连接,网络连接等),try-with-resources 是一个定义了一个或多个资源的try 声明,try语句在该语句结束时自动关闭这些资源。try-with-resources确保每一个资源在处理完成后都会被关闭。这些资源必须实现AutoCloseable或者Closeable接口,实现这两个接口就必须实现close() 方法。示例如下:

    package why;  
      
    import java.io.FileInputStream;  
    import java.io.PrintWriter;  
    import java.util.Scanner;  
      
    public class Xin {  
      
        public static void main(String[] args) throws Exception {  
      
            try(Scanner in = new Scanner(new FileInputStream(“d:\\haha.txt”));  
                    PrintWriter out = new PrintWriter(“d:\\hehe.txt”)) {  
                while(in.hasNext()) {  
                    out.println(in.next().toUpperCase());  
                }  
            }  
        }  
    }  

其基本语法是:try(资源){资源动作}比如

public static String processFile() throws IOException {
try (
	BufferedReader br = new BufferedReader(new FileReader("D:data.txt"))
    ) 
    { 
	return br.readLine();
    }
}

      一个try-with-resourcse如果在try中打开多个资源,用分号隔开(某些书里错写成了逗号)。和声明一个对象相同,会在结束后自动调用close方法。 此外,try-with-resources 可以跟catch和finally,catch和finally中的对象是在try-with-resources里声明的对象关闭之后才执行(并不建议这样)。如果try块和close块都抛出一个异常,那么close块的异常将会“被抑制”。这些异常将会自动捕获,并由addSuppressed方法增加到原来的异常。如果对这个异常感兴趣,可以调用getSuppressed方法,将会得到从close方法抛出并被抑制的异常列表。

        jdk1.7之后新增加了几个API:

        1)void addSuppressed(Throwable t)  为这个异常增加一个“抑制”异常。这出现在带资源的try语句块中,其中t是close方法抛出的一个异常。

        2)Throwable[ ] getSuppressed( )   得到这个异常的所有“抑制”异常。一般来说,这些是带资源的try语句中close方法抛出的异常。

猜你喜欢

转载自blog.csdn.net/qq564425/article/details/81324484