java.util.ConcurrentModificationException即使使用迭代器也从arraylist中删除元素时
我试图在满足特定条件时从两个ArrayList中删除内容。但当条件满足时,我得到了并发修改错误。在互联网上搜索后,我看到了使用迭代器概念修复此问题的解决方案,但这也不起作用 下面是我尝试过的两种代码变体:[我的代码在Kotlin中] 第一个变化:删除后立即获得错误java.util.ConcurrentModificationException即使使用迭代器也从arraylist中删除元素时,java,android,firebase,android-studio,kotlin,Java,Android,Firebase,Android Studio,Kotlin,我试图在满足特定条件时从两个ArrayList中删除内容。但当条件满足时,我得到了并发修改错误。在互联网上搜索后,我看到了使用迭代器概念修复此问题的解决方案,但这也不起作用 下面是我尝试过的两种代码变体:[我的代码在Kotlin中] 第一个变化:删除后立即获得错误 var index = 0 for (snap: DataSnapshot in snaps){ if (snap.key == snapshot.key){
var index = 0
for (snap: DataSnapshot in snaps){
if (snap.key == snapshot.key){
snaps.removeAt(index)
emailOfSenders.removeAt(index)
}
index++
}
第二种变体:如果arraylist中的项少于3,则可以使用,但如果项为3或多于3,则会出现相同的错误
var index = 0
val iter: Iterator<DataSnapshot> = snaps.iterator()
while (iter.hasNext()) {
val snap: DataSnapshot = iter.next()
if (snap.key == snapshot.key){
snaps.removeAt(index)
emailOfSenders.removeAt(index)
}
index++
}
更多信息:我正在创建一个snapchat克隆应用程序,我正在使用谷歌的firebase,一切都很完美,比如在firebase中上传、删除、删除。所以我不认为这是firebase的问题如果您使用迭代器对集合进行迭代,那么您只能使用迭代器的mutator方法修改集合,如果您尝试使用集合的mutator方法remove、set等修改集合,那么迭代器将抛出ConcurrentModificationException,这就是迭代器的定义 在您的情况下,应该执行iterator.remove,而不是执行snaps.removeAtindex 请注意,iterator.remove将删除迭代器返回的最后一个元素。所以,为了删除一个元素,您必须首先调用next方法 例如,假设您想要删除第一个元素。要实现这一点,您必须执行以下操作
iterator.next()
iterator.remove() // Removes the element returned by next
如果arraylist中的项目少于3个,则此选项有效,但如果项目为
3个或3个以上,我得到相同的错误
var index = 0
val iter: Iterator<DataSnapshot> = snaps.iterator()
while (iter.hasNext()) {
val snap: DataSnapshot = iter.next()
if (snap.key == snapshot.key){
snaps.removeAt(index)
emailOfSenders.removeAt(index)
}
index++
}
这是因为ConcurrentModificationException是由下一个方法引发的,并且因为在1或2个元素的情况下,它只被调用一次,在任何修改之前都被调用,所以不会出现任何错误。在上述情况下,执行以下步骤:
1. iterator.hasNext() // returns true
2. iterator.next() // works fine, since we have not modified collection yet
3. snaps.removeAt(index) // removes one element
4. iterator.hasNext() // returns false as there is only one element in list
5. iterator.next // this line is not executed and hence no error
如果使用迭代器对集合进行迭代,则只能使用迭代器的mutator方法修改集合;如果尝试使用集合的mutator方法remove、set等修改集合,则迭代器会抛出ConcurrentModificationException,这称为迭代器的类型 在您的情况下,应该执行iterator.remove,而不是执行snaps.removeAtindex 请注意,iterator.remove将删除迭代器返回的最后一个元素。所以,为了删除一个元素,您必须首先调用next方法 例如,假设您想要删除第一个元素。要实现这一点,您必须执行以下操作
iterator.next()
iterator.remove() // Removes the element returned by next
如果arraylist中的项目少于3个,则此选项有效,但如果项目为
3个或3个以上,我得到相同的错误
var index = 0
val iter: Iterator<DataSnapshot> = snaps.iterator()
while (iter.hasNext()) {
val snap: DataSnapshot = iter.next()
if (snap.key == snapshot.key){
snaps.removeAt(index)
emailOfSenders.removeAt(index)
}
index++
}
这是因为ConcurrentModificationException是由下一个方法引发的,并且因为在1或2个元素的情况下,它只被调用一次,在任何修改之前都被调用,所以不会出现任何错误。在上述情况下,执行以下步骤:
1. iterator.hasNext() // returns true
2. iterator.next() // works fine, since we have not modified collection yet
3. snaps.removeAt(index) // removes one element
4. iterator.hasNext() // returns false as there is only one element in list
5. iterator.next // this line is not executed and hence no error
它所在的场景应该是匹配元素在列表中的最后一个。对于迭代器,您只能使用iterator.remove方法。它所在的场景应该是匹配元素在列表中的最后一个。对于iterator,您只能使用iterator.remove方法。感谢您的详细解释:。我终于明白我做错了什么。你的解决方案帮助了我。谢谢:谢谢您的详细解释:。我终于明白我做错了什么。你的解决方案帮助了我。谢谢:D