java - Java 循环迭代器抛出 ConcurrentModificationException

标签 java mysql iteration jfreechart

我在进行迭代循环时遇到问题。每当我尝试创建循环时,它都会抛出 ConcurrentModificationException。我想做的是在 JFreeChart GUI 中显示来自数据库的输入数据。我已经为此工作了几个小时。我看到一些几乎相似的问题,但我的不同之处是从 MySQL 数据库显示

这是我的一些代码:

    public static ArrayList<String> s  = new <String> ArrayList() ;
    public static ArrayList<Double> d  = new <Double> ArrayList() ;
    public static Iterator op1 = s.iterator();
    public static Iterator op2 = d.iterator();

DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
    while(op1.hasNext()){
    Object a= op1.next();
    Object b= op2.next();
    String c = (String) a;
    double d = (double) a;
    dataset.addValue(d , speed , c);  
  }  

最佳答案

不要将迭代器放入(静态)字段中。

就目前情况而言,迭代器是在将任何内容放入列表之前创建的;因此,在您将任何内容放入列表后,这些迭代器将会失败。

以下内容简单地重现了这一点:

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
list.add("");
it.next(); // Concurrent modification exception

如果迭代器是在添加之后创建的,则不会遇到同样的问题。尝试反转 Iterator<String> it = list.iterator();list.add("");行查看此内容。

基本上,当发生任何结构更改(例如添加或删除元素)时,迭代器就会失效。

在包含循环的方法中紧接循环之前创建迭代器。

DefaultCategoryDataset dataset = new DefaultCategoryDataset( );   
Iterator<String> op1 = s.iterator(); // Don't use raw types.
// Same for other iterator.
while(op1.hasNext()){
  String c = op1.next();

您可能还需要采取措施来避免真正的并发修改(迭代期间由不同线程进行的修改),例如确保在修改和迭代列表时对列表进行独占访问。

关于java - Java 循环迭代器抛出 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736843/

相关文章:

java - 为什么说我们不需要克隆不可变类?

java - 在 TreeSet 中,基于不同属性的自定义对象的排序和唯一性

go - true 或 false 应该终止回调迭代吗?

c++ - LAPACK 函数在第一次迭代后变慢

java - Apache solr 获取(打开文件太多)

java - toString 不适用于 getSelectedItem - Android

mysql - 与 ActiveRecord 和 Sinatra 的多维 JOIN

mysql - Admin多属性MYSQL如何高效连接

mysql - 表格规范化

javascript - jQuery:遍历选择器 ID