Scanner class' hasNext() on infinite loop
我正在尝试编写使用Scanner类来获取用户输入的代码。 但hasNext(),hasNextInt()和hasNextLine()每次都会遇到无限循环。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public static void getInput (ArrayList <Double > arr ){
Scanner input = new Scanner (System. in);
String data ="";
String init ;
while(input. hasNextLine()){
init = input. nextLine();
data += init ;
}
.
.
.
} |
-
那你觉得它怎么样? 什么应该告诉扫描仪没有下一行? 提示:按ENTER输入换行符,该换行符计为...换行符。 你知道EOF字符吗?
-
你确定它是一个'无限循环'还是只是hasNextLine阻塞等待输入?
-
@Fureeish我理解但是下一次迭代不应该使用换行符吗?
-
当然它会消耗它,但你知道当hasNext...系列的成员发现你用System.in绑定它并且扫描器缓冲区中没有任何内容时会发生什么? 它将等待输入...并且它将继续这样做,直到你提供一个将使hasNext...停止的角色。 对于hasNextLine(),end of file character。 对于hasNextInt(),它是任何无法转换为int的字符序列,依此类推......
-
@Fureeish哦,我明白了。 如何提供EOF角色。 或者我是否创建自己的哨兵值?
当且仅当源关闭时,在Scanner对象上调用hasNextLine()将返回false。 如果Scanner尝试从源读取字节或者到达流末尾(EOF)时发生IOException,则可以通过在InputStream上调用close()来执行此操作。 当到达末尾并接收此标记时,文件的InputStream将被关闭,而从System.in读取将阻塞,直到数据可用或抛出异常。
在Unix上,EOF标记通常由Ctrl-D提供,而在Windows上,它通常是Ctrl-Z。 如果您使用的是IDE,您可能会发现它们不同; 例如,我的Windows机器上的Intellij IDE使用Ctrl-D,Eclipse过去遇到了问题。
-
"当你用System.in创建Scanner时,它将等待下一个输入,直到它收到EOF标记。" - 这是不正确的。 它将等待一个无法解释为有效hasNext[...]部分的字符。 EOF适用于所有内容,但您不必每次都使用它。 例如,只要有一个无法解析为int的字符,hasNextInt()就会返回false。
-
@Fureeish好点。 我的意思是,并且应该说,hasNextLine()将阻塞直到下一个输入或Scanner推断InputStream被关闭。