我在循环迭代时遇到问题。每当我尝试进行循环时,它都会不断抛出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/