item9 · try-with-resources 优先于 try-finally
try-with-resources
可以更好地解决资源关闭问题
例子
static void copy(String src, String dst) throws IOException {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buf = new byte[128];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
}
}
前提
- Java 7 引入
try-with-resources
- 构造的资源,必须先实现
AutoCloseable
接口
优点
将上例改为 try-finally
如下:
static void copy(String src, String dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);
try {
byte[] buf = new byte[128];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
} finally {
out.close();
}
}finally {
in.close();
}
}
- 使用
try-with-resources
可以使代码变得简洁、清晰 - 如果内层
read
方法发生底层错误,那么在close
时也会抛出错误,而close
抛出的异常会抹除read
抛出的异常,导致调试变得非常复杂