2012-04-08 54 views
0

我必須失去了一些東西明顯有關各種掃描方法的工作原理,但這真的沒有任何意義:刪除包含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 ://做cs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#next%28%29)

回答

4

因爲hasNext不會從Scanner中刪除任何東西,所以在第一種情況下,你永遠不會改變它的狀態,因此無限循環。 next提取輸入,並因此更改Scanner的狀態。

+0

這很有道理,但我只是不明白爲什麼沒有明確提到方法的細節?也許這只是我,但當我閱讀「查找並返回來自此掃描器的下一個完整標記」時,它聽起來像一個類似存取器的方法,而不是進行任何更新。 – user1086516 2012-04-08 20:22:03

+0

@ user1086516:好的。 'hasNext' /'next'是迭代器的標準Java成語。 – 2012-04-08 20:26:27

0

在第二個示例中調用valueScan.next()是使掃描儀向前移動的原因。 hasNext()只檢查您的掃描儀中是否有下一個項目,但不執行任何操作,因此如果至少有一個項目是無限循環。

0

沒有next()Scanner將不會迭代。

0

hasnext只告訴你下一個元素是否存在,next是否轉到該元素。

因此,在您的第一個循環中,它將停留在第一個元素上,並不斷告訴您第二個元素存在並且什麼也不做。