java.util.ConcurrentModificationException 谁能给我解释一下这个的逻辑原因

标签 java collections exception

我正在创建一个类调用学生并想将它们存储在列表中我正在使用迭代器从列表中获取元素但是我不能这样做因为发生了异常并且我无法解决这里发生的异常,它如果有人能给我合理的理由,那将是很大的帮助。谢谢

    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 Collection 类是fail-fast, 这意味着如果在某些线程使用迭代器遍历它时更改 Collection,iterator.next() 将抛出 ConcurrentModificationException。在多线程和单线程 java 编程环境中都可能出现并发修改异常。

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

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

因此它发现 modCount 被更改并抛出 ConcurrentModificationException。

因此,如果您仍想对运行 Iterotir 的列表进行并发修改,您可能需要使用不同的数据结构,如 CopyOnWriteArrayList 代替列表

关于java.util.ConcurrentModificationException 谁能给我解释一下这个的逻辑原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42665527/

相关文章:

java - 模拟一个具有一些由随机值生成的字段的类?

java - 模态对话框

c# - 在 C# 中找不到 throw 与 throw ex 之间的任何区别

c++ - 尝试打印数组元素返回 “Access violation reading location 0xCCCCCCCC. occurred”

java - 覆盖 VideoView 但保持对 Android 底层 Activity 的关注

java - 正则表达式匹配数字和运算符之间的空格,但数字之间没有空格

java - 如何过滤 Java 集合(基于谓词)?

.net - 具有硬阈值的队列结构

Java集合插入: Set vs.列表

java - 为什么异常错误字符串在不同环境下会有所不同?