[英]Removal of println containing next() causes an infinite loop?
关于各种 Scanner 方法的工作原理,我一定遗漏了一些明显的东西,但这真的没有任何意义:
此代码导致无限循环:
Scanner valueScan = new Scanner(line);
valueScan.useDelimiter(",");
while(valueScan.hasNext())
{
count++;
}
虽然此代码有效:
Scanner valueScan = new Scanner(line);
valueScan.useDelimiter(",");
while(valueScan.hasNext())
{
System.out.println("value token: " + valueScan.next());
cellCount++;
}
这是来自 Oracle 的文档我不确定它是否适用或它的含义:“此方法可能会在等待输入扫描时阻塞,即使先前调用 hasNext() 返回 true。”(http://docs.oracle .com/javase/1.5.0/docs/api/java/util/Scanner.html#next%28%29)
因为hasNext
不会从Scanner
中删除任何内容,所以在您的第一种情况下,您永远不会更改其 state,因此无限循环。 next
提取输入,因此更改Scanner
的 state。
在您的第二个示例中对valueScan.next()
的调用是使扫描仪向前移动的原因。 hasNext()
只检查扫描仪中是否有下一个项目,但不做任何其他事情,因此如果至少有一个项目,则无限循环。
没有next()
Scanner
将不会迭代。
hasnext
仅告诉您下一个元素是否存在以及next
是否转到该元素。
所以在你的第一个循环中,它停留在第一个元素并不断告诉你第二个元素存在并且什么都不做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.