使用迭代器在移除对象时出现了IllegalStateException异常

4

我一直在与这个 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();
            }
        }
    }

在调用remove方法时,会引发IllegalStateException异常。

我一直在想这个问题是否可能是因为我正在删除列表中的最后一项,但似乎即使在过程中间也会出现错误。

请问你们能给我解释一下吗?

1个回答

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
        }
    }
}

我这样做了,但是实际上弄乱了我的解析,我忘记提到了,抱歉,你认为我的解析方法有问题吗?除了防止IllegalStateException之外,这个break并没有改变任何东西,对吗? - Simon MILHAU
1
@SimonMILHAU break语句会跳出内部循环。假设您发布了内部循环的所有逻辑,它只包含一个条件,并在该条件为真时调用“remove”。一旦调用remove,在内部循环中就没有其他事情要做了,因此break非常合理。如果您的实际代码在内部循环中有其他逻辑,则需要使用一些布尔变量(以确定是否调用“remove”)而不是使用break。 - Eran
谢谢@Eran,现在非常清楚了。我想问题可能是由于错误的解析条件或类似的问题导致的,但现在我可以在没有异常的情况下测试它了! - Simon MILHAU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接