public class FileUtil2 {
public static String readFile(String name) throws FileNotFoundException {
StringBuilder builder = new StringBuilder();
try(Scanner scanner = new Scanner(new FileInputStream(name))) {
while (scanner.hasNext()) {
builder.append(scanner.nextLine());
builder.append('\n');
}
}
return builder.toString();
}
}上面是应用了try-with-resources语法的代码,如果把try-with-resources部分展开后,就如下:
public static String readFile(String name) throws FileNotFoundException {
StringBuilder builder = new StringBuilder();
Scanner scanner = new Scanner(new FileInputStream(name));
Throwable localThrowable2 = null;
try {
while (scanner.hasNext()) {
builder.append(scanner.nextLine());
builder.append('\n');
}
} catch (Throwable localThrowable1) { // 嘗試捕捉所有錯誤
localThrowable2 = localThrowable1;
throw localThrowable1;
}
finally {
if (scanner != null) { // 如果scanner參考至Scanner實例
if (localThrowable2 != null) { // 若先前有catch到其它例外
try {
scanner.close(); // 嘗試關閉Scanner實例
} catch (Throwable x2) { // 萬一關閉時發生錯誤
localThrowable2.addSuppressed(x2); // 在原例外物件中記錄
}
} else {
scanner.close(); // 若先前沒有發生任何例外,就直接關閉Scanner
}
}
}
return builder.toString();
}我不明白的是,在finally部分,有两个scanner.close(),为什么第一个 scanner.close()要用捕捉异常,但是第二个 scanner.close()却可以直接调用,难道就不怕出现异常?
public static String readFile(String name) throws FileNotFoundException {
StringBuilder builder = new StringBuilder();
try(Scanner scanner = new Scanner(new FileInputStream(name))) {
while (scanner.hasNext()) {
builder.append(scanner.nextLine());
builder.append('\n');
}
}
return builder.toString();
}
}上面是应用了try-with-resources语法的代码,如果把try-with-resources部分展开后,就如下:
public static String readFile(String name) throws FileNotFoundException {
StringBuilder builder = new StringBuilder();
Scanner scanner = new Scanner(new FileInputStream(name));
Throwable localThrowable2 = null;
try {
while (scanner.hasNext()) {
builder.append(scanner.nextLine());
builder.append('\n');
}
} catch (Throwable localThrowable1) { // 嘗試捕捉所有錯誤
localThrowable2 = localThrowable1;
throw localThrowable1;
}
finally {
if (scanner != null) { // 如果scanner參考至Scanner實例
if (localThrowable2 != null) { // 若先前有catch到其它例外
try {
scanner.close(); // 嘗試關閉Scanner實例
} catch (Throwable x2) { // 萬一關閉時發生錯誤
localThrowable2.addSuppressed(x2); // 在原例外物件中記錄
}
} else {
scanner.close(); // 若先前沒有發生任何例外,就直接關閉Scanner
}
}
}
return builder.toString();
}我不明白的是,在finally部分,有两个scanner.close(),为什么第一个 scanner.close()要用捕捉异常,但是第二个 scanner.close()却可以直接调用,难道就不怕出现异常?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货