得到“ConcurrentModificationException”,即使我使用迭代器?

时间:2015-09-09 01:50:01

标签: java iterator

我收到了ConcurrentModificationException但我真的不明白为什么..当我使用迭代器时它不应该工作正常吗?

public void nextDay(){
        int range = (10 - 0) + 1; 
        ListIterator<User> it = this.socialNetwork.getPeopleInNetwork().listIterator();    
        while(it.hasNext()) {

            User user = it.next();   
            int random = (int)(Math.random() * range) + 0;
            if(user.getFriends().size()<=25){
                try {

                    this.socialNetwork.getPeopleInNetwork().add(user.addFriend(new UserImpl("new","user")));
                    user.addFriend(this.socialNetwork.getPeopleInNetwork().get(random));
                } catch (IllegalArgumentException | UserAlreadyInFriendListException e) {
                    logger.error(e.getMessage());
                }
            }else{
                try {
                    this.socialNetwork.getPeopleInNetwork().add(user.addFriend(new UserImpl("new","user")));
                    this.socialNetwork.getPeopleInNetwork().add(user.addFriend(new UserImpl("new","user")));
                    this.socialNetwork.getPeopleInNetwork().add(user.addFriend(new UserImpl("new","user")));
                    user.addFriend(this.socialNetwork.getPeopleInNetwork().get(random));
                } catch (IllegalArgumentException | UserAlreadyInFriendListException e) {
                    logger.error(e.getMessage());
                }

            }
        }
    }

1 个答案:

答案 0 :(得分:3)

不,你在迭代时不能修改列表,除非你使用迭代器本身来修改它。

如果计划在不使用迭代器的情况下修改原始列表,则应创建副本并迭代副本。

否则,您可以使用迭代器修改列表。

查看add的{​​{1}}方法:

http://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html#add(E)