1

java.util.Scannerコンソールからコマンドを読み取るために使用します。

try
{
    ICommand cmd = cmdReader.ReadCommand();
    cmd.Execute(conn);
}
catch(MyException ex)
{
    // print a message about unknown command
    continue;
}

WhereReadCommandは次のように実装されています。

try (Scanner scanIn = new Scanner(System.in)) 
{
    if (!scanIn.hasNextLine()) return null;

    line_ = scanIn.nextLine();

    ICommand command = parser_.ParseCommand(line_);
    return command;
}

最初の反復コードでは正常に動作します。何か無効なもの (コマンドではない) を書きます。コードは警告を出力して続行します。しかし、コンソールに何かを書いても、他の反復はnullここに戻ります。if (!scanIn.hasNextLine()) return null;入力が見えjava.util.Scannerないようです。私は何か間違ったことをしていますか?そして、どうすればユーザー入力を待つことができますか (でサイクルを使用したくないsleep)?

4

1 に答える 1

5

Scannerを呼び出すたびに新しいインスタンスを作成しないでくださいReadCommand。1 つ作成し、入力の読み取り中に再利用します。

ドキュメントから:

ソースが Closeable インターフェースを実装している場合、 Scanner が閉じられると、その入力ソースが閉じられます。

したがって、System.in最初の入力を読み取った後、ストリームは閉じられます。

Java スキャナーが入力を待機しないも参照してください。

于 2012-12-19T10:23:48.760 に答える