我需要一些迭代器的帮助,看起来无论我做什么都不断给我错误:
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();
}
}
答案 0 :(得分:1)
您现在遇到的问题是因为您正在创建迭代器,然后通过加载字典来修改列表,然后使用迭代器(现在抛出异常,因为在创建迭代器后修改了列表)。 p>
您将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();
}
迭代器只是一个临时对象,可以用于迭代一组项目,它不需要留下来。在需要时创建一个,然后在完成它时忘记它。
答案 1 :(得分:1)
在创建Collection
之后但在完成迭代之前,您正在修改名为webster
的{{1}}。这会导致Iterator
。
考虑到您在ConcurrentModificationException
之前不需要进行迭代,只需在那里创建一个本地writer
,这样就无法检测到修改
Iterator