循环迭代器Java抛出ConcurrentModificationException

时间:2017-03-11 15:16:43

标签: 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);  
  }  

1 个答案:

答案 0 :(得分:1)

不要将你的迭代器放在(静态)字段中。

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

以下简单地重新创建:

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();

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