我正在尝试从Java文件中读取内容,然后将其关闭。但我不知道在何处放置close方法。

    try {
        Scanner scanner = new Scanner(new FileInputStream("data"));
        while (scanner.hasNext()){
            String line = scanner.nextLine().trim();
            set.add(line);
        }
        //scanner.close();
    } catch (FileNotFoundException e) {
        System.out.println("data is not found");
        e.printStackTrace();
    } finally{
        //scanner.close();
    }


如您在代码中所看到的,我可能在两个地方放置close方法,一个在try里面,一个在最后。
如果我将其放在try子句中,则此后会失败,无法关闭扫描程序;但是,如果我将它放在finally子句中,则需要在尝试子句之前声明扫描器,这样,如果文件打开失败,则close方法最终就没有意义,因为扫描器仍然为null。

我知道这些想法一定有问题,有人可以指出吗?

最佳答案

如果您使用的是Java 8,则强烈建议使用try-with-resources

try (Scanner scanner = new Scanner(new FileInputStream("data"))) {
    while (scanner.hasNext()) {
        String line = scanner.nextLine().trim();
        set.add(line);
    }
} catch (FileNotFoundException e) {
    System.out.println("data is not found");
    e.printStackTrace();
}


通过这种模式,java隐式添加了一个finally块来调用scanner.close()

如果您无法利用Java 8的功能,那么最好的选择是在scanner块之前声明try并在finally中将其关闭时检查是否为null:

Scanner scanner = null;
try {
    scanner = new Scanner(new FileInputStream("data"));
    while (scanner.hasNext()) {
        String line = scanner.nextLine().trim();
        set.add(line);
    }
} catch (FileNotFoundException e) {
    System.out.println("data is not found");
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

08-04 07:32
查看更多