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;
- }
- }
- }
- }
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());
- }
- }
- }
- }
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-with-resourcse声明了包含两个对象的声明,用分号隔开(某些书里错写成了逗号)。和声明一个对象相同,会在结束后自动调用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方法抛出的异常。