Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.ConcurrentModificationException即使使用迭代器也从arraylist中删除元素时_Java_Android_Firebase_Android Studio_Kotlin - Fatal编程技术网

java.util.ConcurrentModificationException即使使用迭代器也从arraylist中删除元素时

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){

我试图在满足特定条件时从两个ArrayList中删除内容。但当条件满足时,我得到了并发修改错误。在互联网上搜索后,我看到了使用迭代器概念修复此问题的解决方案,但这也不起作用

下面是我尝试过的两种代码变体:[我的代码在Kotlin中]

第一个变化:删除后立即获得错误

        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