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

时间:2012-04-08 19:57:48

标签: java java.util.scanner infinite-loop

我必须遗漏一些关于各种扫描仪方法如何工作的明显信息,但这实际上没有任何意义:

此代码导致无限循环:

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)

4 个答案:

答案 0 :(得分:4)

因为hasNext不会从Scanner删除任何内容,所以在第一种情况下,您永远不会更改其状态,因此无限循环。 next提取输入,从而更改Scanner的状态。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

没有next() Scanner不会迭代。

答案 3 :(得分:0)

hasnext仅告诉您下一个元素是否存在且next是否转到该元素。

所以在你的第一个循环中,它停留在第一个元素并且一直告诉你第二个元素存在而不再做任何事情。