java.util.ConcurrentModificationException有人能解释一下这其中的逻辑原因吗

java.util.ConcurrentModificationException有人能解释一下这其中的逻辑原因吗,java,collections,exception-handling,Java,Collections,Exception Handling,我正在创建一个类调用student,希望将它们存储在列表中我正在使用迭代器从列表中获取元素,但我不能这样做,因为正在发生异常,并且我无法解决此处发生的异常,如果有人能给我提供这方面的逻辑原因,那将非常有帮助。谢谢 import java.awt.List; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.

我正在创建一个类调用student,希望将它们存储在列表中我正在使用迭代器从列表中获取元素,但我不能这样做,因为正在发生异常,并且我无法解决此处发生的异常,如果有人能给我提供这方面的逻辑原因,那将非常有帮助。谢谢

    import java.awt.List;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Vector;
    import java.util.List.*;

    public class Runs {

        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub

            try {

                // adding student class to list
                java.util.List list = new ArrayList<Student>();
                Student q = new Student("hello", 1);
                Iterator<Student> l = list.iterator();
                list.add(q);
                // error false in this segment of the code
                Student op = l.next();
                String hhh = op.getnamez();
                System.out.println(hhh);
                System.out.println(op.getnamez());

            } catch (Exception e) {
                System.out.println("" + e);

            }

        }

        public static class Student {
            // student class
            public String name;
            private int age;

            public Student(String s, int a) {

                this.name = s;
                this.age = a;

            }

            public String getnamez() {
                return this.name;

            }

        }

    }
导入java.awt.List;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.Iterator;
导入java.util.Vector;
导入java.util.List.*;
公开课{
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
试一试{
//将学生类添加到列表中
java.util.List List=new ArrayList();
学生q=新生(“你好”,1);
迭代器l=list.Iterator();
列表。添加(q);
//此代码段中出现错误false
学生op=l.next();
字符串hhh=op.getnamez();
系统输出打印LN(hhh);
System.out.println(op.getnamez());
}捕获(例外e){
系统输出打印项次(“+e”);
}
}
公立静态班学生{
//学生班
公共字符串名称;
私人互联网;
公立学生(字符串s,整数a){
this.name=s;
这个年龄=a;
}
公共字符串getnamez(){
返回此.name;
}
}
}

Java集合类是快速失败的,这意味着如果某个线程使用迭代器遍历集合时该集合将被更改,
迭代器.next()
将抛出ConcurrentModificationException。在多线程和单线程java编程环境中都可能出现并发修改异常

在您的示例中,一旦行
list.add(q)被执行,它更改迭代器的
modCount
属性

modCount
提供更改列表大小的次数
modCount
值用于每个
迭代器。next()
调用检查函数中的任何修改
checkForComodification
()

因此,它发现要更改modCount,并抛出ConcurrentModificationException


因此,如果您仍然希望对运行iTroTir的列表进行并发修改,您可能需要粘贴不同的数据结构,如CopyOnWriteArrayList,以替代列表

可能的正确副本。虽然它也可以出现在多线程程序中,但在我所看到的几乎所有情况下(这里是如此),简单的单线程程序都存在问题。异常名称中的并发对某些人来说可能有点混乱。非常感谢您的解释@mhasan先生!!!我真的理解了代码段上发生的事情。再次感谢:)