2

我创建了一个算法来读取文件并检查用户输入的多个问题。我正在使用 Netbeans,它建议尝试使用资源。我不确定的是文件的关闭。当我第一次创建我的算法时,我把 file.close() 放在了错误的位置,因为它之前有一个“return”语句而无法访问:

while (inputFile.hasNext()) {
        String word = inputFile.nextLine();
        for (int i = 0; i < sentance.length; i++) {
            for (int j = 0; j < punc.length; j++) {
                if (sentance[i].equalsIgnoreCase(word + punc[j])) {

                    return "I am a newborn. Not even a year old yet.";
                }
            }
        }
    }
    inputFile.close(); // Problem

所以我用这个修复了它:

        File file = new File("src/res/AgeQs.dat");
    Scanner inputFile = new Scanner(file);
    while (inputFile.hasNext()) {
        String word = inputFile.nextLine();
        for (int i = 0; i < sentance.length; i++) {
            for (int j = 0; j < punc.length; j++) {
                if (sentance[i].equalsIgnoreCase(word + punc[j])) {
                    inputFile.close(); // Problem fixed
                    return "I am a newborn. Not even a year old yet.";
                }
            }
        }  
    }

问题是,当我以错误的方式设置它时,Netbeans 建议这样做:

        File file = new File("src/res/AgeQs.dat");
    try (Scanner inputFile = new Scanner(file)) {
        while (inputFile.hasNext()) {
            String word = inputFile.nextLine();
            for (int i = 0; i < sentance.length; i++) {
                for (int j = 0; j < punc.length; j++) {
                    if (sentance[i].equalsIgnoreCase(word + punc[j])) {

                        return "I am a newborn. Not even a year old yet.";
                    }
                }
            }  
        }
    }

Netbeans 是在更正我的代码,还是只是删除文件的关闭?这是做这件事的更好方法吗?除非我确切地知道发生了什么,否则我不喜欢使用代码。

4

3 回答 3

6

try-with-resources 保证 AutoCloseable 资源(如 Scanner)将始终关闭。关闭是由 javac 约隐式添加的。作为

Scanner inputFile = new Scanner(file);
try {
    while (inputFile.hasNext()) {
        ....
    }
} finally {
    inputFile.close();
}

顺便说一句,您的代码中存在 Netbeans 未能注意到的问题。Scanner 的方法不会抛出 IOException 而是抑制它。使用 Scanner.ioException 检查读取文件时是否发生异常。

于 2012-12-29T04:04:38.963 回答
1

Netbeans 是在更正我的代码,还是只是删除文件的关闭?

它正在更正您的代码。try-with-resource 在隐式 finally 子句中关闭了在资源部分中声明/创建的资源。(所有资源都必须实现Closeable接口...)

于 2012-12-29T04:02:00.237 回答
1

阅读本文,重新阅读 Java 7 的 try-with-resource 块。

try-with-resources 语句确保每个资源在语句结束时关闭。

Java 6 不支持 try-with-resources;您必须显式关闭 IO 流。

于 2012-12-29T03:51:30.317 回答