首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Iterator 遍歷陷阱:多次調用 next() 導致元素跳過與異常

     編輯:Java 綜合教學

問題現場

使用 Iterator 遍歷時,若在循環體內多次調用 it.next(),會導致**游標重複前移**,造成元素跳過,甚至拋出 NoSuchElementException。

錯誤代碼

while (it.hasNext()) {
    // 錯誤:調用了兩次 next(),游標移動兩次
    System.out.println(((Person) it.next()).getName() + "--" + ((Person) it.next()).getAge());
    // 若集合元素為奇數,第二次 next() 會拋出異常
}

正確姿勢:緩存 next() 返回值

while (it.hasNext()) {
    Person p = (Person) it.next(); // 只調用一次,保存引用
    System.out.println(p.getName() + "--" + p.getAge());
}

原理深度解析

  • Iterator 內部維護一個 cursor 游標,初始為 0。
  • next() 返回 elementData[cursor++],**每次調用都會使游標 +1**。
  • hasNext() 判斷 cursor != size。

因此,循環體內**必須且只能調用一次 next()**,否則邏輯與游標狀態不一致。

圖示驗證

錯誤輸出

正確輸出

最佳實踐建議

  1. 優先使用 增強 for 循環(for (Person p : list)),編譯器自動生成正確 Iterator 代碼,杜絕手寫錯誤。
  2. 若需索引,使用 ListIterator 或普通 for (int i=0; i。
  3. Lambda list.forEach(p -> ...) 同樣安全且簡潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved