繁体   English   中英

列表的并发修改异常

[英]Concurrent modification exception for list

谁能告诉我这里哪里出错了?

  File promoCountFile = new File(RaconTours.PATH + "promocodeCount.txt");
            if (promoPlistPath.exists()) {
                try {
                    ObjectInputStream inStream = new ObjectInputStream(new FileInputStream(promoPlistPath));
                    ObjectInputStream promoStream = new ObjectInputStream(new FileInputStream(promoCountFile));
                    promoobj = (ArrayList<HashMap<String, Object>>) promoStream.readObject();
                    obj = (ArrayList<HashMap<String, Object>>) inStream.readObject();
                    for (HashMap<String, Object> tmpObj : obj) {
                        promoTourname = (String) tmpObj.get("promoTour");
                        promocodeID = (String) tmpObj.get("promocode");
                        if (promoTourname.equals(currentTour.getObjtourName())) {
                            //if the condition is met, remove the entry from the file
                            for (HashMap<String, Object> promoTemp : promoobj) {
                                promoTourCount =  (Integer) promoTemp.get("promocodeTourCount");
                            }

                            obj.remove(tmpObj);
                            --promoTourCount; 

                            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(promoPlistPath)); 
                            out.writeObject(obj);
                            out.close();

                            ObjectOutputStream promoout = new ObjectOutputStream(new FileOutputStream(promoCountFile)); 
                            HashMap<String, Object> promoCountDict = new HashMap<String, Object>();
                            promoobj.remove(0);
                            promoCountDict.put("promocodeTourCount",promoTourCount);
                            promoobj.add(promoCountDict);
                            promoout.writeObject(promoobj);
                            promoout.close();


                        }
                    }


                    if (obj.size() == 0 || promoTourCount == 0) {
                        promoPlistPath.delete();
                        promoCountFile.delete();
                    }
                } catch (Exception e) { 
                    e.printStackTrace();
                }

            }

这里它给我并发修改异常,而for循环迭代第二次或之后。

我试图在循环迭代时每次更新promoTourCount的值。 但我没有做到。 因为为了避免添加多个对象,我将删除位置0处的对象并将新的对象添加到该位置( promoobj.remove(0);

Plz帮助我

您正在修改正在迭代的集合。 这将触发错误。 你在这里迭代obj:

for (HashMap<String, Object> tmpObj : obj) {

但是从这里删除它:

obj.remove(tmpObj);

我建议您将要删除的项目存储在另一个集合中,并仅在完成for循环时将其从地图中删除。

编辑 :<< 添加示例代码 >>

List<Integer> toRemove = new LinkedList<Integer>();
for (int i = 0; i < obj.size(); i++) {
    HashMap<String, Object> tmpObj = obj.get(i);

    if (/* something */) {
        /* ... */
        /* obj.remove(tmpObj);  replaced with*/
        toRemove.add(0, i); // notice that I add bigger indices first
    }
}
// Here we make the removal from bigger indices to smaller ones
// Notice that we iterate and remove from different collections.
for (Integer indexToDelete : toRemove) {
    obj.remove(indexToDelete);
}

当您想要删除元素时,这是基本的想法。 但是,您需要在for循环中立即输出obj作为修改。 那么指数的一些黑客可能会为你做得更好:

for (int i = 0; i < obj.size(); i++) {
    HashMap<String, Object> tmpObj = obj.get(i);

    if (/* something */) {
        /* ... */
        /* obj.remove(tmpObj);  replaced with*/
        obj.remove(i); // We erase the element but this time we do not use enhanced for loop which is ok.
        i--; // we decrease the index because th enumber of elements decreased. Index hack. Ugly.
        System.out.println(obj); // modified obj :)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM