我的扫描仪功能遇到问题。即使在终端中输入“退出”后,扫描仪仍会继续运行。我怀疑这种行为与
revertState()
实现中的 hasNext()
函数有关,但我不确定。
String cmd;
do {
cmd = scanner.nextLine();
// ...
}
System.out.printf("%b%n", !cmd.equals("exit"));
} while(scanner.hasNext() && !cmd.equals("exit"));
但是,将语句重新排列为
!cmd.equals("exit") && scanner.hasNext()
是可行的,因为由于短路评估,scanner.hasNext() 将不会被调用。
如果您连续输入两次“exit”,我希望它退出。尝试在调用
nextLine
之前打印一些内容,您会发现第二次尝试读取输入不是来自 nextLine,而是来自 hasNext。
来自官方文档:
next() 和 hasNext() 方法及其基元类型伴随方法(例如 nextInt() 和 hasNextInt())首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。 hasNext 和 next 方法都可能阻塞等待进一步的输入。 hasNext 方法是否阻塞与其关联的 next 方法是否会阻塞没有关系。
这就是您所观察到的行为的原因,如果您切换条件中的分支,短路评估(又名麦卡锡评估)将阻止
hasNext
运行,从而立即退出,为您提供正确行为的感觉,但这并不严格正确。尝试在调用 System.out.println("reading...")
之前添加 nextLine
,我怀疑这样会更清楚。