使用迭代器删除对象时出现IllegalStateException

时间:2015-07-16 09:02:04

标签: java parsing arraylist iterator

我一直在讨论这个bug,我不知道问题出在哪里。我的代码是这样的:

ArrayList<String> lTmpIndicsDesc = new ArrayList<String>(indicsDesc);
ArrayList<String> lTmpIndicsAvailableMark = new ArrayList<String>(indicsAvailableMark);
    for (Iterator<String> itIndicsDesc = lTmpIndicsDesc.iterator(); itIndicsDesc.hasNext();) {
        String sTmpIndicsDesc = itIndicsDesc.next();
        for (Iterator<String> itIndicsAvailableMark = lTmpIndicsAvailableMark.iterator(); itIndicsAvailableMark.hasNext();) {
            String sTmpIndicsAvailableMark = itIndicsAvailableMark.next();
            if (sTmpIndicsDesc.toUpperCase().equals(sTmpIndicsAvailableMark.toUpperCase())) {
                itIndicsDesc.remove();
            }
        }
    }

它在删除调用上引发了IllegalStateException。

我一直想知道问题是否会出现,因为我删除了我的列表中的最后一项,但即使在过程中间它也似乎有问题。

请问你能给我一个解释吗?

1 个答案:

答案 0 :(得分:4)

您正从内循环内部的lTmpIndicsDesc列表中删除元素。这意味着你的内部循环可能会尝试两次删除相同的元素,这可以解释你得到的异常。删除元素后,您应该从内部循环中断:

for (Iterator<String> itIndicsDesc = lTmpIndicsDesc.iterator(); itIndicsDesc.hasNext();) {
    String sTmpIndicsDesc = itIndicsDesc.next();
    for (Iterator<String> itIndicsAvailableMark = lTmpIndicsAvailableMark.iterator(); itIndicsAvailableMark.hasNext();) {
        String sTmpIndicsAvailableMark = itIndicsAvailableMark.next();
        if (sTmpIndicsDesc.toUpperCase().equals(sTmpIndicsAvailableMark.toUpperCase())) {
            itIndicsDesc.remove();
            break; // added
        }
    }
}