2
package sandbox2;

import java.util.Scanner;

public class Sandbox2
{
    public static void main(String[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            String s = askForProperty("Enter value for " + i + ": ");
            System.out.println(i + " is: " + s);
        }

    }

    private static String askForProperty(String message)
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.print(message);
        String s = keyboard.nextLine();
        keyboard.close();

        return s;
    }
}

上記のコードを実行すると、最初の応答が完全に返されます。2 番目の応答を要求しようとすると、次のように返されます。

java.util.NoSuchElementException: No line found

なぜこのエラーが返されるのでしょうか? メソッド askForProperty が呼び出されるたびに、スキャナは完全に新しいインスタンスになります! 入力ストリームとして System.in と何か関係がありますか?

4

3 に答える 3

0

そう、

Scannerコードの主な問題は、反復ごとに作成してすぐに閉じることです。それは単に機能しません。Scannerかなりの組み立てが必要な IO への大規模な接続を想像してみてください。毎回開いたり閉じたりすると、接続が再度開かれる前に次のコマンドが起動される場合があります。これは、DB 接続で見られるものと非常によく似ています。これを防ぐ方法は、反復を開始する前に Scanner を開き、ループを終了してから閉じることです。

したがって、close() ステートメントを askForProperty() 関数から削除し、メインに移動します。Scanner キーボード オブジェクトを関数に渡します。すべての反復が終了したら、それを閉じます。

import java.util.Scanner;

public class Sandbox2
{
    public static void main(String[] args)
    {
        Scanner keyboard = new Scanner(System.in); // Initialize the Scanner
        for (int i = 0; i < 5; i++)
        {
            String s = askForProperty("Enter value for " + i + ": ", keyboard); // Pass the Scanner
            System.out.println(i + " is: " + s);
        }
        keyboard.close(); // Close the Scanner now that the work is done.
    }

    private static String askForProperty(String message, Scanner keyboard)
    {
        System.out.println(message);
        String s = keyboard.nextLine();
        return s;
    }
}
于 2014-02-11T18:53:59.367 に答える
0

スキャナーをクラス変数として定義し、すべての反復が完了した後にのみ閉じます。現在のセットアップでは、電話をかけるkeyboard.closeと閉じSystem.inているため、後で使用できなくなります。

package sandbox2;
import java.util.Scanner;

public class Sandbox2 {
    static Scanner keyboard = new Scanner(System.in); // One instance, available to all methods

    public static void main(String[] args)  {
        for (int i = 0; i < 5; i++) {
            String s = askForProperty("Enter value for " + i + ": ");
            System.out.println(i + " is: " + s);
        }
        keyboard.close(); //Only close after everything is done.
    }

    private static String askForProperty(String message) {
        System.out.print(message);
        String s = keyboard.nextLine();
        return s;
    }
}
于 2014-02-11T18:41:42.267 に答える