java - 即使使用 ListIterator,ConcurrentModificationException 仍然存在

标签 java

我正在用 Java 开发一个图书馆系统。我有一个名为 Things 的类(class),有两个 child :PrintDigital打印然后分为书籍期刊

以下是我编写的用于打印项目的代码片段。完整代码包含导入。

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

感谢您的帮助。

最佳答案

问题

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

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

解决方案

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

public class Collection {
    private ArrayList <Things> theCollection;

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

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

关于java - 即使使用 ListIterator,ConcurrentModificationException 仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30724272/

相关文章:

java - DAO 和 Hibernate 类的标准命名

java - JUnit 测试用例的最大覆盖率

java - 在 Spark、Java 中合并元组两个值的数据

java - 如何将 CheckedChange Listener 传递给自定义 View

java - 如何从父类而不是父类(super class)调用重写的方法?

java - 序列化——C++和Java的区别

java - 为什么 Intellij Idea 让我们通过生成器生成不正确的 equals()-hashcode() 对?

java - 在java中查找特定命名方案的所有文件

java - 我的代码有什么问题?无法解释的语法错误

java - ProcessBuilder 执行自定义可执行文件