try-with-resources
- try-catch-finally的语法糖,java7首次提供。
- 使用到的资源需要需要实现AutoCloseable接口。
- 可以简化try-catch-finally的写法,将资源关闭的代码隐藏。
- 作为语法糖,仅起到简化代码的作用。
- 目前还是很少使用这种写法,更多的还是使用原始的try-catch-finally写法。
- 以上仅个人看法。
- 常规的try-catch-finally
InputStream in = null;
try {
in = new FileInputStream(new File("D://test.txt"));
int len = in.read();
System.out.println(len);
}
catch (IOException e)
{
e.printStackTrace();
}
finally {
if (in != null)
{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码较多,尤其是finally块中,对资源的关闭的写法比较累赘。
- 使用try-with-resources
try (InputStream in = new FileInputStream(new File("D://test.txt")))
{
int len = in.read();
System.out.println(len);
} catch (IOException e) {
e.printStackTrace();
}
代码量明显减少,也易于理解,尤其是之前那些累赘代码消失了。
- try-with-resources本质
try {
InputStream in = new FileInputStream(new File("D://test.txt"));
try {
int len = in.read();
System.out.println(len);
} catch (Throwable var5) {
try {
in.close();
} catch (Throwable var4) {
var5.addSuppressed(var4);
}
throw var5;
}
in.close();
} catch (IOException var6) {
var6.printStackTrace();
}
上面的代码为编译后的try-with-resources代码,即语法糖的本质代码,这个代码看起来并不整洁。尤其第二层的try-catch-finally代码块。鉴于此,个人更喜欢以下代码:
Throwable类的addSuppressed方法:是java7新增的,用于传递被抑制的异常。白话讲就是说,var5中添加了var4的异常信息,在var5抛出后,捕获者可以得到var4和var5的信息。如果不这么处理,将 var5.addSuppressed(var4); 代码改为 throw var4;或者throw var5;,都只能得到二者之一的信息,另一个信息丢失了。
try {
InputStream in = new FileInputStream(new File("D://test.txt"));
int len = in.read();
System.out.println(len);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}