【问题标题】:ConcurrentModificationException persisting even with ListIterator即使使用 ListIterator,ConcurrentModificationException 仍然存在
【发布时间】:2015-08-23 19:29:55
【问题描述】:

我正在做一个 Java 库系统。我有一个名为 Things 的班级,有两个孩子:PrintDigitalPrint又分为BookPeriodical

以下是我为打印项目而编写的代码的 sn-p。完整的代码有导入。

public class Collection
{
    private ArrayList <Things> theCollection;
    private ListIterator <Things> listItr;

    public Collection ()
    {
        theCollection = new ArrayList <> ();
        listItr = theCollection.listIterator ();
    }

    public void get ()
    {
        Things sThing;
        Book sBook;
        Periodical sPeriodical;
        Digital sDigital;

        sThing = listItr.next ();
        if (sThing instanceof Book)
        {
            sBook = (Book) sThing;
            sBook.bookInfo ();
        }
        else if (sThing instanceof Periodical)
        {
            sPeriodical = (Periodical) sThing;
            sPeriodical.periodicalInfo ();
        }
        else if (sThing instanceof Digital)
        {
            sDigital = (Digital) sThing;
            sDigital.digitalInfo ();
        }
    }

    public void printAll ()
    {
        while (listItr.hasNext ())
            get ();
    }
}

get() 方法中的以下语句有问题:

sThing = listItr.next ();

当我运行代码时,它给了我一个 ConcurrentModificationException。我试图在网上搜索答案,但他们都建议使用迭代器,我有。我哪里做错了?

感谢您的帮助。

【问题讨论】:

  • 如何(以及何时)将项目添加到列表中?
  • 能分享一下 bookInfo() 方法吗?

标签: java


【解决方案1】:

问题

您在构建类时创建/请求迭代器,直接在创建列表之后。此时列表将为空。

我假设您之后在该列表中添加/删除元素。这是一个并发修改,因为迭代器在创建后将迭代限制在未修改的列表上。对迭代器的下一次调用将抛出此异常。

解决方案

不要在类的构造函数中创建迭代器。在需要的时间创建它:

public class Collection {
    private ArrayList <Things> theCollection;

    public Collection () {
        theCollection = new ArrayList <> ();
    }

    public void get () {
        ...
        ListIterator <Things> listItr = theCollection.listIterator();
        sThing = listItr.next ();
        ...
    }
}

【讨论】:

    【解决方案2】:

    问题出在构造函数上:

    public Collection ()
    {
        theCollection = new ArrayList <> ();
        listItr = theCollection.listIterator ();
    }
    

    您在将元素添加到列表之前创建一个 ListIterator;为了避免错误,您必须在迭代元素之前创建迭代器;所以删除构造函数中的迭代器创建并在您需要它之前放置;有关类似问题,请参阅 herehere

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多