try(Rescourse res = ...){
work with recourse
}
try块退出时,会自动调用res.close(0
try(var in = new Scanner(
new FileInputStram("D:\\Target.txt",StandardCharsets.UTF-8)){
while(in.hasNext()){
System.out.println(n.next());
}
}
这个块正常退出时,或者存在一个异常是,都会调用in.close()方法,就好像使用了finally块一样
还可以指定多个资源。
try(var in = new Scanner(
new FileInputStram("D:\\Target.txt",StandardCharsets.UTF_8);
var out = new PrintWriter("out.txt",StandardCharsets.UTF_8)){
while(in.hasNext()){
out.println(n.next().toUpperCase());
}
}
不管这个块如何退出,in 和 out 都会关闭,如果用常规方式编程,就徐需要两个嵌套try/finally语句。
在java9中,可以在try首部中提供之前声明的事实最终变量。
public static void printAll(Strng[] lines,PrintWriter out){
try(out){
for(String line:lines){
out.println(line);
}
} // out.close()在这里调用
}
如果try块抛出一个异常,而且close也抛出一个异常,try-with-recourse语句可以很好的处理。原来的异常会重新抛出,儿close抛出的异常会被‘抑制’。这些异常将自动捕获,并由addSuppressed方法增加到原来的异常。如果对这些异常感兴趣,可以调用getSuppressed方法,它会生成从close方法抛出并被抑制的异常数组。
只要需要关闭资源,就尽可能使用try-with-resources语句。
try-with-resources语句自身也可以有catch语句,甚至还可以有一个finally字句,这些子句会在关闭资源后执行。