Java中的try with resources
在try–catch-finally 中,假如try和finally中都不幸地抛出了 IOException,那程序的调试任务就变得复杂了起来,到底是哪一处出了错误,就需要花一番功夫,这是我们不愿意看到的结果。
但有了 try-with-resources 后,这些问题就迎刃而解了。前提条件只有一个,就是需要释放的资源(比如 BufferedReader)实现了 AutoCloseable 接口。
try (BufferedReader br = new BufferedReader(new FileReader(decodePath));) {
String str = null;
while ((str =br.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
finally 块消失了,取而代之的是把要释放的资源写在 try 后的 ()
中。如果有多个资源(BufferedReader 和 PrintWriter)需要释放的话,可以直接在 ()
中添加。
try (BufferedReader br = new BufferedReader(new FileReader(decodePath));
如果想释放自定义资源的话,只要让它实现 AutoCloseable 接口,并提供 close()
方法即可。
public class TrywithresourcesCustom {
public static void main(String[] args) {
try (MyResource resource = new MyResource();) {
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("关闭自定义资源");
}
}
原理是编译器主动为 try-with-resources 进行了变身,在 try 中调用了 close()
方法。如下
public static void main(String[] args) {
try {
MyResource resource = new MyResource();
resource.close();
} catch (Exception var2) {
var2.printStackTrace();
}
}
总结
在处理必须关闭的资源时,始终有限考虑使用 try-with-resources,而不是 try–catch-finally。前者产生的代码更加简洁、清晰,产生的异常信息也更靠谱。