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()却可以直接调用,难道就不怕出现异常?