最近在做通用数据收集接口.由于业务比较复杂,数据无法在数据库中完成分组和排序.只要在内存中进行.需要对java的List进行迭代删除.当时条件反射的用了java的foreach循环.在循环中用了remove操作.代码大致如下:

List<TopIndex> topIndexes=....

for(TopIndex topIndexe : topIndexes){

   //....

   topIndexes.remove(topIndexe );

   //...

}

  很自然出现了不一致的数据,但是没有throw异常.经过过跟踪,发现了问题.于是将foreach循环改写为:

for(Iterator<TopIndex> it=topIndexes.iterator();it.hasNext();){

   //....

  topIndexe=it.next();

   topIndexes.remove(topIndexe );

   //...

}.

这次抛出异常了,异常信息提示非同步操作.我立马想到删除操作应该用于迭代器的remove方法.否者会抛出异常.于是改写了代码:

for(Iterator<TopIndex> it=topIndexes.iterator();it.hasNext();){

   //....

it.next();

//...........

 

  it.remove();

   //...

}.

 

而后,程序正确运行.通过这次我bug排除,我认识到.不能仅仅记得书本上的理论,教条.更应动手实践,积累经验.形成条件反射.

在发现问题,解决问题后,需要总结,下次遇到同样的问题,就可以迎刃而解了.

本次总结如下:   java foreach只能用于只读的情况.如果需要删除操作,请用迭代器或者直接遍历List.