了解ConcurrentModificationException

时间:2014-05-28 17:58:55

标签: java arraylist

我有一个Metricas的ArrayList。 每个Metrica都有一些属性和另一个ArrayList lForms。 我想要的是检查数据库以查看表单是否已填写,并更新lForms。 当我这样做时,我得到一个ConcurrentModificationException,我不知道如何摆脱它...

public ArrayList<Metrica> addAllForms(ArrayList<Metrica> lMetricas) {
    ArrayList<Metrica> newlMet = lMetricas;
    ArrayList<Formulario> lForms = null;
    ArrayList<Formulario> newlForms;
    Metrica newMetrica;
    Formulario f;
    for (Iterator<Metrica> it = lMetricas.iterator(); it.hasNext();) {
        Metrica metrica = it.next();

        newlForms = new ArrayList<Formulario>();
        lForms = metrica.getlForms();
        for (Iterator<Formulario> it2 = lForms.iterator(); it2.hasNext();) {
            Formulario form = it2.next();

            f = getForm(form);
            if (f == null) {
                addForm(form, metrica.getId());
                Log.e("log", "adding form");
            } else
                form = f;
            Log.e("log", "Getting adding form");

            newlForms.add(form);

        }

        newMetrica = new Metrica();
        newMetrica.setlForms(newlForms);
        newMetrica.setClienteId(metrica.getClienteId());
        newMetrica.setDatoValido(metrica.getDatoValido());
        newMetrica.setDescription(metrica.getDescription());
        newMetrica.setId(metrica.getId());
        newMetrica.setProyectoProductoId(metrica.getProyectoProductoId());
        newMetrica.setTipo(metrica.getTipo());

        newlMet.add(newMetrica);

    }

    return lMetricas;
}

1 个答案:

答案 0 :(得分:0)

而不是

for (Metrica metrica : lMetricas) 

使用以下内容:

Iterator<Metrica> it = lMetricas.iterator();
while(it.hasNext())
{
    Metrica metrica = it.next();
    //...
}

同样,您需要使用lForms进行相同的操作。

编辑:如果您想添加内容,则无法在迭代时添加它们。而是使用另一个ArrayList来存储要添加的元素。然后,使用lMetricas.addAll()一次性添加所有内容。

如果要将它们添加到特定位置,则需要使用Map<Metrica, Integer>并使用这些值来查找要添加的位置。