`
tianhandigeng
  • 浏览: 374292 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Iterator使用的大陷阱

 
阅读更多

     今天在使用Iterator的时候被一个问题困扰了很久,最后通过一步步的找错终于找出了错误,原因是忽视了一个小问题,现在先来说一下我的操作:

	while(it.hasNext()){
					Map<String,Object> product=it.next()
;
					if(product.containsKey("pid")){
						int value=Integer.parseInt(String.valueOf(product.get("pid")));
						if(value==pid){
							shoppingList.remove(it.next()
);
						}
					}
				}

这是我的代码,相信大家都可以看懂了,但是奇怪的是运行这段代码以后,总是报NoSuchElementException 异常,为什么呢?找了很久都没找出来,最后发现了问题的所在, 看到上面的红色标记没有,这里有两个it.next();我们来看一下这个方法在API中的说明:

 

next
E next()
Returns the next element in the iteration. 

Returns:
the next element in the iteration. 
Throws: 
NoSuchElementException - iteration has no more elements.

 现在应该知道问题的所在了吧,第一个it.next()后再去it.next()就不是原来想要的了,也就是说it.next()后这个it就指向了下一个对象,所以第二个it.next() 应该换成product,对于Iterator处理,建议新建一个变量保存it.next()的值,后面就直接对这个值操作就行了。

 

 

<!-- Generated by javadoc (build 1.6.0) on Wed Nov 29 02:21:55 PST 2006 -->

<noscript></noscript>
分享到:
评论
15 楼 qjtttt 2011-03-20  
楼主在逗大家。。。。
14 楼 wendal 2011-02-22  
Javaeye能否过滤一下,这种LJ帖就不要上主页啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
13 楼 rockethj8 2011-02-22  
囧~!orz
12 楼 bitray 2011-02-22  
楼主确实很搞笑
11 楼 xgj1988 2011-02-22  
OH 卖糕的
10 楼 freish 2011-02-22  
hello world级别的错误
9 楼 webee 2011-02-22  
LZ,这个问题就像我今天才知道原来首都机场在北京一样!
8 楼 webee 2011-02-22  
大陷进啊,晕!
7 楼 wdz567 2011-02-22  
楼主自己要注意。。。。。
6 楼 prettyinsight 2011-02-22  
我还以为楼主要说的是同时对一容器进行迭代和删除操作
5 楼 deeplyloving 2011-02-22  
 楼主太逗了
4 楼 li445970924 2011-02-22  
你在一个{}里调了两次 it.next()
3 楼 泛舟天下 2011-02-22  
自己的错误,不要归咎于Iterator
2 楼 seanla 2011-02-22  
确实是低级错误
1 楼 avgguy 2011-02-22  
Orz.......

这种低级错误也敢贴出来........

相关推荐

    java集合迭代器Iterator中的remove陷阱

    本篇文章将深入探讨`Iterator`中的`remove`方法以及它在`List`和`Set`集合中的陷阱。 首先,`Iterator`接口提供了一个`remove()`方法,它的作用是移除当前迭代器指向的元素。在使用`Iterator`遍历集合并删除元素时...

    避坑手册 - JAVA编码中容易踩坑的十大陷阱.doc

    正确的做法是使用迭代器(Iterator)进行删除,或者使用Java 8的Lambda表达式或`removeAll()`方法。例如: - 使用迭代器: ```java Iterator&lt;User&gt; iterator = userList.iterator(); while (iterator.hasNext())...

    [C++][经验总结]vectory迭代器(iterator)失效

    然而,一个常见的陷阱是,当我们对`vector`进行某些操作时,其迭代器可能会失效,这正是 "[C++][经验总结]vectory迭代器(iterator)失效" 这一主题的核心所在。理解这个问题对于编写稳定且高效的C++代码至关重要。 ...

    js代码-Iterator遍历对象

    在`README.txt`文件中,可能会详细解释`main.js`中`Iterator`的使用场景和具体实现,包括如何创建自定义迭代器,如何与`for...of`、`Array.from()`等方法配合使用,以及可能遇到的陷阱和注意事项。 总的来说,`...

    effective stl 中文 pdf

    迭代器:条款26至条款29提供了迭代器使用的建议和技巧,比如将const_iterator转换为iterator、使用istreambuf_iterator等。 算法:条款30至条款37讲解了STL算法的正确使用和注意事项,包括目的范围检查、排序选项...

    Effective_STL英文版

    书中详细讲解了STL使用中的最佳实践和陷阱,为读者提供了50条指导原则。在本书中,作者不仅仅提供了规则,还给出了详细的分析和实例,让读者明白何时何地怎样使用STL,以及这样做的原因。 ### 容器使用原则 1. ...

    java中for循环删除集合陷阱

    如果必须在循环中进行增删改操作,可以考虑使用迭代器或者`Iterator.remove()`方法,这能更安全地处理集合的动态变化。同时,理解集合遍历和修改之间的交互是避免这类陷阱的关键。在实际编程中,应尽可能遵循最佳...

    apache-spark-best-practices-and-tuning

    此外,应当避免使用iterator列表。在处理迭代器时,应该使用flatMap(),而不是多个iterator的列表。因为flatMap()能够减少迭代器列表所需的复制操作,从而提高性能。 开发者也应注意,当不需要返回确切的行数时,...

    more effectiveC++

    5. **考虑使用const_iterator**:在遍历容器时,使用`const_iterator`可以防止意外修改容器中的元素。这有助于保持数据的完整性,尤其是在遍历只读数据时。 6. **了解运算符重载的陷阱**:虽然运算符重载能增强代码...

    zzbd.rar_正则表达式_正则表达式c++

    - 避免使用贪婪匹配,可能导致不必要的大范围匹配。使用非贪婪量词?来限制匹配。 - 注意正则表达式中的顺序,因为它们是左到右解析的,可能导致意料之外的结果。 9. **扩展应用** - 在网络爬虫中,正则表达式...

    突破程序员基本功的16课.part2

    3.4 Iterator迭代器 迭代时删除指定元素 3.5 小结 第4课 Java的内存回收 4.1 Java引用的种类 4.1.1 对象在内存中状态 4.1.2 强引用 4.1.3 软引用 4.1.4 弱引用 4.1.5 虚引用 4.2 Java的内存泄漏 4.3 垃圾...

    关于STL的erase()陷阱-迭代器失效问题的总结

    然而,使用`erase()`时需要特别注意的一个问题是迭代器失效,即在删除元素后,与该元素相关的迭代器将不再有效。本文将深入探讨这个问题,并通过实例分析在不同类型的STL容器中如何安全地使用`erase()`。 首先,让...

    AW - Effective STL

    虽然 `const_iterator` 和 `const_reverse_iterator` 在只读访问时非常有用,但在能够进行修改时使用普通的迭代器可以避免不必要的类型转换。 **Item 27: 使用 `std::distance` 和 `std::advance` 将容器的 `const_...

Global site tag (gtag.js) - Google Analytics