[英]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.