【问题标题】:ConcurrentModificationException Error using Iterators [.next()]使用迭代器的 ConcurrentModificationException 错误 [.next()]
【发布时间】:2014-05-23 06:08:46
【问题描述】:

我需要一些关于迭代器的帮助,似乎无论我做什么它都会给我错误:

Exception in thread "main" java.util.ConcurrentModificationException
 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
 at java.util.ArrayList$Itr.next(ArrayList.java:831)
 at package.Dictionary.writer(Dictionary.java:72)
 at package.main.main(main.java:24) <5 internal calls>

我可以使用任何提供的帮助来帮助解决这个问题,我对 Java 编程有点陌生。我的完整代码如下:

package package;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.*;

public class Dictionary {
    Collection<String> webster = new ArrayList<String>();
    Iterator<String> iter = webster.iterator();
    File path = null;

    public Dictionary(Collection<String> words) {
        if (words == null) {
            throw new NullPointerException("Error: Collection NULL");
        } else {
            if (!words.isEmpty()) {
                clear();
            }
        }
    }

    public long load(File file) throws FileNotFoundException {
        String filePath = file.getAbsolutePath();
        if (file.getAbsolutePath().equals(null)
                || file.getAbsolutePath().equals("")) {
            throw new FileNotFoundException("Error: No File Found!");
        } else {
            if (file.exists()) {
                Scanner fileScanner = new Scanner(new File(filePath));
                long time = System.nanoTime();
                while (fileScanner.hasNext()) {
                    webster.add(fileScanner.next());
                }
                long time2 = System.nanoTime();
                long duration = time2 - time;
                return duration;
            } else {
                throw new FileNotFoundException("Error: No File Exsists!");
            }
        }
    }

    public boolean contains(String target) {
        if (webster.contains(target)) {
            return true;
        } else {
            return false;
        }
    }

    public void clear() {
        webster.clear();
    }

    public void writer() throws Exception {
        PrintWriter out = new PrintWriter("words.txt");
        while (iter.hasNext()) {
            out.println(iter.next());
        }
        out.close();
    }
}

【问题讨论】:

  • "package" 是关键字,因此不是有效的包名称。
  • 快速修复:不要使用迭代器。
  • "package" 不是真正的包名,我不得不把它换掉。而且我知道我不能使用迭代器,但这更具挑战性。
  • @njzk2 这不是一个很好的建议,因为它引出了一个普遍的问题,“为什么?迭代器是不是很糟糕?”并让读者对迭代器产生误导。
  • @JasonC,注意到了,但这是我被告知要使用迭代器做的事情,因为我在学习它们之前正在学习它们。我知道“foreach”,但它只是我不能在我的 Java 类中使用的东西。不过谢谢!

标签: java arraylist iterator concurrentmodification


【解决方案1】:

您现在遇到的问题是因为您正在创建迭代器,然后通过加载字典来修改列表,然后使用迭代器(现在抛出异常,因为列表在迭代器创建后被修改)。

您将Iterator 作为实例变量,并在初始化时对其进行实例化。你不想在这里这样做。相反,请在您使用它的方法中创建Iterator,例如摆脱实例变量并执行:

public void writer() throws Exception {
    PrintWriter out = new PrintWriter("words.txt");
    Iterator<String> iter = webster.iterator();
    while (iter.hasNext()) {
        out.println(iter.next());
    }
    out.close();
}

或者,甚至更清楚,并且不使用明确的Iterator,只需执行以下操作:

public void writer() throws Exception {
    PrintWriter out = new PrintWriter("words.txt");
    for (String entry : webster)
        out.println(entry);
    out.close();
}

迭代器只是一个临时对象,可用于迭代项目集合,它不需要一直存在。在需要时创建一个,然后在完成时忘记它。

【讨论】:

    【解决方案2】:

    您正在修改名为 websterCollection 在创建 Iterator 之后但在它完成迭代之前。这会导致ConcurrentModificationException

    考虑到在writer 之前不需要迭代,只需在那里创建一个本地Iterator,这样就不会检测到修改。

    PrintWriter out = new PrintWriter("words.txt");
    Iterator<String> iter = webster.iterator();
    while (iter.hasNext()) {
        out.println(iter.next());
    }
    out.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2017-11-11
      • 2013-03-27
      • 2018-06-19
      • 1970-01-01
      • 2013-09-26
      • 2017-10-18
      相关资源
      最近更新 更多