1

我用来java.util.Scanner从控制台读取命令。

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

其中ReadCommand实现如下:

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。创建一个并在读取输入时重用它。

文档中:

当 Scanner 关闭时,如果源实现了 Closeable 接口,它将关闭其输入源。

因此,System.in在您读取第一个输入后,您的流将关闭。

另请参阅Java Scanner 不等待输入

于 2012-12-19T10:23:48.760 回答