【问题标题】:Closing Scanner/PrintStream in finally-block which are declared in try-block在 try-block 中声明的 finally-block 中关闭 Scanner/PrintStream
【发布时间】:2021-03-15 18:33:42
【问题描述】:

我试图在 finally 块中关闭 Scanner 和 PrintStream,它们在 try 块中声明。问题是,如果 try-block 由于异常而失败,则永远不会声明 Scanner 和 Printstream,从而导致 finally-block 中出现错误,我想在其中关闭它们。代码如下:

        try {
            File readFile = new File(readFileName);
            File writeFile = new File(writeFileName);
            Scanner fileScanner = new Scanner(readFile);
            PrintStream output = new PrintStream(new FileOutputStream(writeFile,false)); // overwrite
            while(fileScanner.hasNextLine()) {
                output.println(fileScanner.nextLine());
                if (!fileScanner.hasNextLine()) {
                    break;
                }
                output.println();
            }
        }
        
        catch (FileNotFoundException fnfe) {
            System.out.println(fnfe.getMessage());
            System.exit(0);
        }
        
        finally {
            fileScanner.close();
            output.close();
        }

编辑:感谢您的回答,我通过在 try-block before 声明 Scanner 和 Printstream 然后在 try-block 中初始化它们来解决这个问题,就像这样:

Scanner fileScanner = null;
PrintStream output = null;
        try {
            fileScanner = new Scanner(readFile);
            output = new PrintStream(new FileOutputStream(writeFile,false));
            ...
        }

【问题讨论】:

标签: java try-catch-finally printstream


【解决方案1】:

您可以使用 try-with-resources 构造:

File readFile = new File(readFileName);
File writeFile = new File(writeFileName);

try (Scanner fileScanner = new Scanner(readFile); PrintStream output = new PrintStream(new FileOutputStream(writeFile,false))) {

    while(fileScanner.hasNextLine()) {
        output.println(fileScanner.nextLine());
        if (!fileScanner.hasNextLine()) {
            break;
        }
        output.println();
    }

} catch (FileNotFoundException fnfe) {
    System.out.println(fnfe.getMessage());
    System.exit(0);
}        

由于ScannerPrintStream 都实现了Autocloseable 接口,所以它们会在异常或try 块执行后自动关闭

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2015-08-14
    • 2021-08-20
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多