我正在为学校做一个编程练习,无法解决" java.util.ConcurrentModificationException"错误

时间:2017-06-28 14:19:16

标签: java class methods

我无法从具有此格式的文件中编译此程序(其中" Via"是意大利语" road")

Via Emilia - > Via Botti
通过Castello - > Via Emilia
Via Appia - > Via Botti
Via Botti - > Via Emilia
通过Castello - > Via Amendola
Via Appia - > Via Ancona
通过Castello - > Via Botti
通过Matteotti - > Via Carso
Via Ancona - > Via Matteotti
Via Carso - > Via Matteotti

并且在第三个问题上要求我找到哪些道路是递归的(如a-> b和b-> a),但是当我尝试设置条件以消除重复答案的可能性时(像a和b是递归的,b和a是递归的)我得到这个错误" java.util.ConcurrentModificationException",这是什么意思?

这是主要的

public static void main(String[] args) throws Exception{

    ArrayList<percorso> perc = new ArrayList<percorso>();

    String line;
    BufferedReader br = new BufferedReader(new FileReader("vie.txt"));

    while ((line = br.readLine())!=null){
    percorso p = new percorso (null,null);
    String [] e = line.split("-->");
    p.from = e[0];
    p.to = e[1];
    perc.add(p);
    }
    br.close();
    //punto1(perc);
    //punto2(perc);
    punto3(perc);
}       

这是在第三个问题上编译答案的方法

    public static void punto3(ArrayList<percorso> perc) throws Exception{

    BufferedWriter bw=new BufferedWriter(new FileWriter("3.html"));
    bw.write("<html> \n <body> \n");
    bw.write("<h1> Punto 3 </h1> \n");
    bw.write("<h3><i> Trovare le coppie di strade che formano un anello chiuso </h3></i> \n");
    ArrayList<percorso> perc2 = new ArrayList<percorso>();
    for (percorso k: perc)
        perc2.add(k);

    ArrayList<String[]> Arr = new ArrayList<String[]>();

    for (percorso i: perc2){
        for (percorso j: perc2){
            if (i.from.equals(j.to) && i.to.equals(j.from)){
                String [] e = {i.from,i.to};
                Arr.add(e);
            }
        }
    }

    ArrayList<String[]> Arr2 = new ArrayList<String[]>();
    for (String [] z: Arr){
        Arr2.add(z);}

    for (String [] f: Arr){
        for (String [] j: Arr2){
            if (f[0].equals(j[1]) && j[0].equals(f[1]))
                Arr.remove(j);
        }
    }
    for (String [] x: Arr)
    bw.write("le vie "+x[0]+", "+x[1]+" formano un anello chiuso <br>");
    bw.write("</body> \n </html> \n");
    bw.close();
    }

percorso课程如下

   public class percorso {
   String from;
   String to;

   public percorso (String from,String to){
    this.from = from;
    this.to = to;
   }
   }

2 个答案:

答案 0 :(得分:0)

您正在尝试在循环播放时从arraylist中删除记录:Arr.remove(j)。 这会导致ConcurrentModificationException。

您可以将其添加到单独的列表中(例如valuesToRemove),而不是在循环时将其从arraylist中删除。这将保留您要删除的所有记录,然后在循环后调用Arr.removeAll(valuesToRemove);

答案 1 :(得分:0)

所以问题是你使用的是Arr.remove(j);在for循环中,你不能这样做。

你可以读到这个: How to avoid "ConcurrentModificationException" while removing elements from `ArrayList` while iterating it?

而且这个 Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

但基本上,你要做的是使用迭代器去除元素,例如:

j <- c(1,3,5,7,9,11,13,15,17,19,21,23)
k <- 1

for (i in j){
  lines(x = c(AAx[i:(i+1),1]), y = c(AAx[i:(i+1),2]))
  text(AAx[i,1],AAx[i,2], names[k], pos = 3)
  k <- k+1
}