java.util.ConcurrentModificationException有人可以解释一下这个的逻辑原因

时间:2017-03-08 07:37:49

标签: java collections exception-handling

我正在创建一个类调用学生,并希望将这些存储在列表中我使用迭代器从列表中获取元素但我不能这样做,因为发生异常并且我无法解决此处发生的异常,它如果有人能给我合乎逻辑的理由,那会很有帮助。谢谢你

    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;

            }

        }

    }

1 个答案:

答案 0 :(得分:3)

Java Collection类 fail-fast,,这意味着如果在某个线程使用迭代器遍历它时将更改Collection,iterator.next()将抛出ConcurrentModificationException。对于多线程以及单线程java编程环境,可能会出现并发修改异常。

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

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

因此,它发现要更改的modCount会抛出ConcurrentModificationException。

因此,如果您仍希望对运行Iterotir的List进行并发修改,则可能需要使用不同的数据结构,例如 CopyOnWriteArrayList 来代替List