java - 即使我没有从 arraylist 中删除任何内容,foreach 循环中也会出现 ConcurrentModificationException

标签 java exception arraylist foreach

我知道有类似的问题,但我浏览了这些问题但没有找到答案。

我的代码是单线程的,它不会删除任何内容,也不会在循环期间修改数组列表,只是添加。

代码:

ArrayList<Record> records = helper.get();
System.out.println("Records in arraylist: " + records.size());
    for (Record x : records) {
        System.out.println("Begin");
        Record record = new Record(many parameters);
        System.out.println("Middle");
        records.add(record);
        System.out.println("End");
    }
    System.out.println("Done reading records and inserting them to arrayList");

输出:

Records in arraylist: 1000
Begin
Middle
End
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at Main.Main.main(Main.java:33)
    ... 5 more

最佳答案

 records.add(record);

您修改了 ArrayList 这一行。

您可以将 for-each 循环转换为索引 for 循环以防止 ConcurrentModificationException,或者您可以创建一个新的 ArrayList 来保存您的记录:

ArrayList<Record> records = helper.get();
ArrayList<Record> result = new ArrayList<Record>();
for (Record x : records) {
    Record record = new Record(many parameters);
    result.add(record);
}

关于java - 即使我没有从 arraylist 中删除任何内容,foreach 循环中也会出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912113/

相关文章:

c++ - Windows 中 boost::serialization 的未知异常

java - Java EE 项目的异常处理架构

java - 删除java arraylist中的重复项

java - 使用 ArrayList 的 android java insertsort

java - 如何以编程方式在 java 中编辑 swagger yaml 文件以将请求参数添加到 REST 端点?

java - 如何赋予 JButton 不同的功能?

java - 使用 API key 和 secret 保护 Spring Boot API

C# VS2012 stacktrace 行是错误的

java - 在java中根据另一个列表的值对多个列表进行排序

java - 获取程序正在运行的 .jar 中文件的 URL