for循环中的java.util.ConcurrentModificationException错误
当我构建我的项目时,没有出现错误,但当应用程序启动时,它崩溃了,并在for循环[for(User user1:mUsers)]的第97行中给出了该错误 错误是:致命异常:主进程:com.example.chatapp,PID:9908 java.util.ConcurrentModificationException 我不明白这个错误以及为什么会出现这个错误 这是我的密码:for循环中的java.util.ConcurrentModificationException错误,java,android,android-studio,Java,Android,Android Studio,当我构建我的项目时,没有出现错误,但当应用程序启动时,它崩溃了,并在for循环[for(User user1:mUsers)]的第97行中给出了该错误 错误是:致命异常:主进程:com.example.chatapp,PID:9908 java.util.ConcurrentModificationException 我不明白这个错误以及为什么会出现这个错误 这是我的密码: private UserAdapter userAdapter; private List<User> mUs
private UserAdapter userAdapter;
private List<User> mUsers;
FirebaseUser fuser;
DatabaseReference reference;
private List<String>usersList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chats, container, false);
recyclerView = view.findViewById(R.id.recycle_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
fuser = FirebaseAuth.getInstance().getCurrentUser();
usersList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Chat");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
usersList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
Chat chat = snapshot.getValue(Chat.class);
assert chat != null;
if (chat.getSender().equals(fuser.getUid())){
usersList.add(chat.getReceiver());
}
if (chat.getReceiver().equals(fuser.getUid())){
usersList.add(chat.getSender());
}
}
readChats();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
return view;
}
public void readChats(){
mUsers = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mUsers.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
User user = snapshot.getValue(User.class);
// display user from chats
for (String id : usersList){
if (user.getId().equals(id)){
if (mUsers.size() != 0){
for (User user1 : mUsers){ // error here
if (!user.getId().equals(user1.getId())){
mUsers.add(user);
}
}
}else {
mUsers.add(user);
}
}
}
}
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
private-UserAdapter-UserAdapter;
私人博物馆名单;
FirebaseUser定影器;
数据库参考;
私有列表用户列表;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u chats,container,false);
recyclerView=view.findViewById(R.id.recycle\u视图);
recyclerView.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(getContext());
fuser=FirebaseAuth.getInstance().getCurrentUser();
usersList=newarraylist();
reference=FirebaseDatabase.getInstance().getReference(“聊天”);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
usersList.clear();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
Chat Chat=snapshot.getValue(Chat.class);
断言聊天!=null;
if(chat.getSender().equals(fuser.getUid())){
添加(chat.getReceiver());
}
if(chat.getReceiver().equals(fuser.getUid())){
usersList.add(chat.getSender());
}
}
readChats();
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
返回视图;
}
公共无效阅读聊天室(){
mUsers=newarraylist();
reference=FirebaseDatabase.getInstance().getReference(“用户”);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
mUsers.clear();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
User=snapshot.getValue(User.class);
//显示聊天记录中的用户
for(字符串id:usersList){
if(user.getId().equals(id)){
如果(mUsers.size()!=0){
对于(用户user1:mUsers){//error here
如果(!user.getId().equals(user1.getId())){
添加(用户);
}
}
}否则{
添加(用户);
}
}
}
}
userAdapter=newuseradapter(getContext(),mUsers);
recyclerView.setAdapter(userAdapter);
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
}此处:
for (User user1 : mUsers){ // error here
if (!user.getId().equals(user1.getId())){
mUsers.add(user);
}
}
在集合中添加元素,同时使用迭代器对其进行迭代。这是不允许的。
请注意,编译后为(用户user1:mUsers)使用的增强for
循环表示为一个
要克服这一限制,您可以使用一个(重点是我的):
用于列表的迭代器,允许程序员遍历列表
在任一方向上,在迭代过程中修改列表,并获得
迭代器在列表中的当前位置
ListIterator listIteratorUser=mUsers.ListIterator();
而(listIteratorUser.hasNext()){
User user1=listIteratorUser.next();
如果(!user.getId().equals(user1.getId())){
添加(用户);
}
}
太好了,可以了,谢谢:)
ListIterator<User> listIteratorUser = mUsers.listIterator();
while(listIteratorUser.hasNext()){
User user1 = listIteratorUser.next();
if (!user.getId().equals(user1.getId())){
listIteratorUser.add(user);
}
}