【问题标题】:Looping Iterator Java throw ConcurrentModificationException循环迭代器 Java 抛出 ConcurrentModificationException
【发布时间】:2017-03-11 15:16:43
【问题描述】:

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

【问题讨论】:

  • 你能告诉我们op1op2的定义吗?
  • 刚刚更新了内容
  • 这需要更多数据:堆栈异常。显示的代码在空列表上有迭代器。 hasNext() 永远不会返回 true。

标签: java mysql iteration jfreechart


【解决方案1】:

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

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

下面简单地重新创建了这个:

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

如果在添加之后创建迭代器,您不会遇到同样的问题。尝试反转 Iterator&lt;String&gt; 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();

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

【讨论】:

  • 感谢它的工作!我对代码所做的更改是修改了迭代器的位置并删除了 public static 修饰符。我想我有点理解 Iterator 是如何工作的
猜你喜欢
  • 2017-10-18
  • 2018-03-19
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2017-11-11
相关资源
最近更新 更多