2012-12-19 99 views
1

我使用java.util.Scanner来从控制台读取命令。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; 
} 

在第一次迭代代码工作正常,我写的东西无效(不是命令),代码打印警告并继续。但是,即使我在控制台中写入某些内容,其他迭代也会在此返回nullif (!scanIn.hasNextLine()) return null;。看起来像java.util.Scanner没有看到输入。难道我做错了什么?那我怎么能等待用户输入(不想用sleep这个循环)?

回答

5

每当您拨打ReadCommand时,都不应创建新的Scanner实例。创建一个并在阅读输入时重复使用它。

documentation

当扫描仪被关闭时,它会如果源实现Closeable接口,关闭其输入源。

因此,您的System.in流在您读取第一个输入后关闭。请参阅Java Scanner does not wait for input