【问题标题】:How to fix ConcurrentModificationException error when adding items during iteration如何在迭代期间添加项目时修复 ConcurrentModificationException 错误
【发布时间】:2020-09-07 12:09:21
【问题描述】:

所以我收到“java.util.ArrayList$Itr.next(ArrayList.java:860) 处的 java.util.ConcurrentModificationException”错误。

我知道我收到此错误的原因是因为我在向列表添加对象的同时迭代列表。但是,我不知道如何添加 listIterator 来解决此问题。

如果有人能告诉我如何添加迭代器,那就太棒了。谢谢!

我已经在我的代码中指出了错误的开始位置

//method to evaluate who you have chatted with and display on screen
private void readChats() {
    users = new ArrayList<>();

    reference = FirebaseDatabase.getInstance().getReference("USERS");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            users.clear();


            //gets every user snapshot from "USERS" children in firebase and make User obj
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                User user = snapshot.getValue(User.class);

                //for every ID that was stored in textTransacRec list
                for (String ID : textTransacRec) {
                    //out of all existing users in firebase if a user's ID matches any of the ID's in textTransacRec
                    if(user.getID().equals(ID)) {
                        //if there are any User objects inside users list
                        if(users.size() != 0) {
                            //check to see if the user already exists in list or not by matching w/ existing user ID's
                            //if there is no ID match then user does not exist --> add to users list to display
                            //---------------------------ERROR STARTS FROM HERE----------------------
                            for(User u : users) {
                                if(!user.getID().equals(u.getID())) {
                                    users.add(user);
                                }
                            }
                        }
                        //if no User objects inside users list --> add to users list
                        else {
                            users.add(user);
                        }
                    }
                }
            }
            chatRecyclerAdap = new ChatRecyclerAdap(getContext(), users);
            recyclerView.setAdapter(chatRecyclerAdap);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

【问题讨论】:

标签: java android android-studio iterator concurrentmodification


【解决方案1】:

ListIterator 有add 方法,你可以这样使用它:

ListIterator<User> iterator = users.listIterator();
while(iterator.hasNext()) {
    User u = iterator.next();
    if(!user.getID().equals(u.getID())) {
        iterator.add(user);
    }
}

但要仅在列表中不存在用户时添加用户,则不需要迭代器。如果您在循环内执行此操作,您将为列表中每个不具有相同 ID 的用户添加一个用户。但是,您需要检查用户的 id 是否与所有用户的 id 不同,并且只添加一次用户。 如果您使用的是 Java 8,则可以执行以下操作:

    boolean userExists = users.stream().filter(u -> u.getID().equals(user.getID())).findFirst().isPresent();
    if (!userExists) {
        users.add(user);
    }

【讨论】:

  • 感谢您的回复。我使用了您发布的第一个代码 sn-p 并且 ConcurrentModification 错误消失了。但是,现在我的列表中出现了重复的对象。我不知道为什么会这样。在实现您的代码 sn-p 后,我附上了应用程序的屏幕截图,以向您展示我的意思
  • 我在我的回答中解释了为什么会发生这种情况。在第一个 sn-p 中,您为列表中没有相同 id 的每个用户添加一个用户。相反,您需要检查用户 id 是所有用户 id 的 dirrenet,并且只添加一次用户。为此,您可以使用第二个 sn-p。
  • @adey1,我的评论能回答你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 2023-03-21
  • 1970-01-01
  • 2022-10-23
  • 2022-12-05
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多