package misc;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Test {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add(new User(0));
        list.add(new User(1));
        list.add(new User(2));
        list.add(new User(3));
        filter(list);
    }    public static void filter(List<User> list){
        for (Iterator it=list.iterator();it.hasNext();){
            User u=(User)it.next();//这里会导致异常
            if (u!=null && u.id==0){
                list.remove(u);
            }        }
    }
}
class User{    int id;
    public User (int id){
        this.id=id;
    }
}
异常信息:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at misc.Test.filter(Test.java:19)
at misc.Test.main(Test.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

解决方案 »

  1.   

    public class Test {
        public static void main(String[] args) {
            ArrayList<User> list=new ArrayList<User>();
            list.add(new User(0));
            list.add(new User(1));
            list.add(new User(2));
            list.add(new User(3));
            filter(list);
        }    public static void filter(List<User> list){
           for (int i = 0;i < list.size(); i++){
                  User u=(User)list.get(i);
                  if (u!=null && u.id==0){
                      list.remove(u);
                      i--;
                  }
              }
        }
    }
      

  2.   

    因为你在跌代时修改了list,会抛此异常
    跌代只读取内容是可以的,在跌代中更新列表就会抛此异常
      

  3.   

    用迭代器遍历的时候不可以直接删除数组中的元素,否则会导致迭代器和当前视图不一致就出错1,2楼都行,注意如果有多个User(0)连在一起,要把if (u!=null && u.id==0)换成while
      

  4.   

    用一楼的吧。Iterator迭代中不要修改被迭代对象。
      

  5.   

    楼主 for 的循环体就不对.........
      

  6.   

    for (Iterator it=list.iterator();it.hasNext();){
                User u=(User)it.next();//这里会导致异常
                if (u!=null && u.id==0){
                    list.remove(u);
                }        }
    把list.remove(u)改成it.remove(u),你用iterator迭代就要用iterator的remove方法
      

  7.   

    应该使用it.remove();并没有参数。
      

  8.   

    http://topic.csdn.net/u/20100609/23/6282a532-d159-4aed-bfe7-0170805bcaa2.html?89173呵呵,这个帖子也是你发的啊·
      

  9.   

    其实就是想把其中的一个引用从集合里删除,删除的过程也就是让某一个引用为NULL,那么直接可以写成
    if (u!=null && u.id==0){
     u==null
      }
      

  10.   

    上面有点写错了 不要意思 应该是 u=null;
      

  11.   

    迭代过程中不能用LIST本身的REMOVE删除元素,但可以用ITERATOR的REMOVE删除元素,即it.remove();