与迭代器

时间:2017-01-05 12:29:16

标签: java arraylist concurrency concurrentmodification

我一直在为一个程序编写代码,我遇到了一些我能够正确解决的问题。但是,我的程序正在抛出ConcurrentModificationException并且我不确定我能做什么。

我正在使用NetBeans 8.0.2编写代码来创建Java桌面应用程序(根据我的教授的要求)。 该计划的目的是管理一家酒店。因此,它有一些部分,如“客户”,“员工”和“预订”(给我带来问题的那个)。

在每个部分,我都有一个使用JTable的{​​{1}}。在每个部分中,我都在使用硬盘驱动器上的文件来使更改持久化。我编写了新的客户/员工课程。现在,我正在尝试编码预订和取消预订方法。在我进入“unbooking”部分之前,一切都进展顺利。

在表格和模型之后我有一个DefaultTableModel。在这个特定的部分,我有三个:

  • 整个表格的一个
  • 仅包含免费房间的
  • 仅限已经预订的房间。

预订部分很好,我可以修改表格,文件和ArrayList,没有任何错误,我的程序实际上做了应有的事情。但我无法让unbooking部分工作。它应该基本上与预订相反。

我会发布我的一小部分代码,但如果您需要了解其他任何内容或需要我的代码的更多部分,我很乐意分享它。

我的代码:

ArrayList

2 个答案:

答案 0 :(得分:0)

ConcurrentModificationException当你对一系列元素(列表)进行更改而你正在主动循环遍历所述链时会发生。

我经常遇到它并且总是通过反向循环遍历列表来解决它,这样你就可以向后循环,如果你想要的话你可以更改或删除元素而不会弄乱链(列表)你'重新循环。

我会为您提供代码,但我发现很难读取您的代码,所以现在必须这样做。

希望这会有所帮助并祝你好运!

答案 1 :(得分:0)

如果自上次使用迭代器后,您正在迭代的Collection的内容已经更改,则在尝试使用或重用它时会出现异常。创建一个新的 - 作为一般规则,don't reuse an iterator

你是:

  1. 创建迭代器
  2. 修改列表
  3. 修改列表后使用迭代器←错误!
  4. 您应该在创建迭代器之前修改列表。

    此外,您应该尝试minimize the scope of local variables

    相反:

    Iterator<String> someIterator = strings.iterator();
    while (someIterator.hasNext()) {
        doSomething();
    }
    

    您应该这样做:

    for (Iterator<String> iter = strings.iterator(); iter.hasNext();) {
        doSomething();
    }
    

    当然,如果您(如您所说)不需要修改列表,请使用for-each循环:

    for (String s : strings) {
        doSomething();
    }
    

    一些不相关的观点:

    • 你为什么写extends java.awt.JFrame之类的东西? Import并改为使用JFrame
    • 在需要时声明并初始化变量。如果您已在Iterator循环前初始化了for ,那么您就不会遇到此问题。
    • 使用generics!非泛型Collection只会在运行时出错,而泛型则会给出编译错误。