即使使用ListIterator,ConcurrentModificationException仍然存在

时间:2015-06-09 06:14:56

标签: java

我在Java上做一个图书馆系统。我有一个名为 Things 的班级,有两个孩子:打印数字。然后将打印分为图书期刊

以下是我为打印项目编写的代码片段。完整的代码有导入。

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。我尝试在线搜索答案,但他们都建议使用迭代器,我就有了。我哪里做错了?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

问题

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

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

解决方案

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

public class Collection {
    private ArrayList <Things> theCollection;

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

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

答案 1 :(得分:3)

问题在于构造函数:

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

在向列表添加元素之前,您正在创建ListIterator;为了避免错误,你必须在迭代元素之前创建迭代器;所以在conustructor中删除迭代器创建并在你需要它之​​前放置;有关类似问题,请参阅herehere