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 リソース (スキャナーなど) が常に閉じられることを保証します。クローズは、javac approx によって暗黙的に追加されます。なので

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

ところで、Netbeans が気付かなかったコードに問題があります。Scanner のメソッドは IOException をスローせず、抑制します。Scanner.ioException を使用して、ファイルの読み取り中に例外が発生したかどうかを確認します。

于 2012-12-29T04:04:38.963 に答える
1

thisを読んで、Java 7 の try-with-resource ブロックを再確認してください。

try-with-resources ステートメントは、各リソースがステートメントの最後で確実に閉じられるようにします。

Java 6 は try-with-resources をサポートしていません。IO ストリームを明示的に閉じる必要があります。

于 2012-12-29T03:51:30.317 に答える
1

Netbeans が私のコードを修正しているのか、それとも単にファイルのクローズを削除しているのか?

コードを修正しています。try-with-resource には、リソース セクションで宣言/作成されたリソースを閉じる暗黙の finally 句があります。(すべてのリソースはインターフェイスを実装する必要がありCloseableます...)

于 2012-12-29T04:02:00.237 に答える