删除包含 next() 的 println 会导致无限循环



我一定错过了一些关于各种扫描仪方法如何工作的明显内容,但这真的没有任何意义:

此代码会导致无限循环:

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中删除任何内容,所以在第一种情况下,你永远不会改变它的状态,因此是无限循环。 next提取输入,从而更改Scanner的状态。

第二个示例中对valueScan.next()的调用是使扫描仪向前发展的原因。 hasNext()只检查扫描仪中是否有下一个项目,但不执行任何其他操作,因此如果至少有一个项目,则无限循环。

hasnext只告诉你下一个元素是否存在,next转到该元素。

所以在你的第一个循环中,它停留在第一个元素上,并不断告诉你第二个元素存在,不再做更多的事情。

如果没有next()Scanner就不会迭代。

最新更新