簡體   English   中英

刪除包含 next() 的 println 會導致無限循環?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM