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

Java 删除包含next()的println会导致无限循环吗?,java,java.util.scanner,infinite-loop,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

我肯定遗漏了一些关于各种扫描仪方法如何工作的明显信息,但这真的没有任何意义:

此代码导致无限循环:

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
不会从
扫描仪中删除任何内容,所以在第一种情况下,您永远不会更改其状态,因此出现无限循环
next
提取输入,并因此更改
扫描仪的状态,因为
hasNext
不会从
扫描仪中删除任何内容,因此在第一种情况下,您永远不会更改其状态,从而产生无限循环
next
提取输入,从而更改
扫描仪的状态

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

第二个示例中对
valueScan.next()
的调用是使扫描仪向前移动的原因
hasNext()
只检查扫描仪中是否有下一个项目,而不做任何其他事情,因此,如果至少有一个项目,则infinte循环。

没有
next()
扫描仪将不会迭代。

没有
next()
扫描器不会重复。

hasnext
只告诉您是否存在下一个元素,并且
下一个
转到该元素


因此,在第一个循环中,它停留在第一个元素上,并不断告诉您第二个元素存在,并且不再执行任何操作。

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


因此,在第一个循环中,它停留在第一个元素上,并不断告诉您第二个元素存在,并且不再执行任何操作。

这很有道理,但我不明白为什么在方法细节中没有明确提到这一点?也许只是我,但当我读到“从该扫描仪中查找并返回下一个完整的令牌”时,它听起来像是一个类似访问器的方法,而不是正在进行任何更新的方法。@user1086516:啊,好的
hasNext
/
next
是迭代器的标准Java习语。这很有道理,但我不明白为什么在方法细节中没有明确提到这一点?也许只是我,但当我读到“从该扫描仪中查找并返回下一个完整的令牌”时,它听起来像是一个类似访问器的方法,而不是正在进行任何更新的方法。@user1086516:啊,好的
hasNext
/
next
是迭代器的标准Java习惯用法。