try-with-resources 优先于 try-finally
根据传统,try-finally 块是确保关闭资源的一个有效方法,但是当多个资源时,就可能造成代码的混乱。而且某个 finally 块中也可能抛出异常,就会使得之前抛出的异常信息被覆盖。
public 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[16];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
在 Java 7 中引入了 try-with-resources 语句之后,就产生了更为方便规范的方式。使用该语句的资源必须实现 AutoCloseable 接口。
public static void copy2(String src, String dst) throws IOException {
try(InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buf = new byte[16];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
}
}
这时,如果前面出现异常,后面的异常就会被禁止。
|