【问题标题】:IllegalStateException when removing an object with iterator使用迭代器删除对象时出现 IllegalStateException
【发布时间】:2015-10-05 15:21:25
【问题描述】:

我一直在为这个错误而苦苦挣扎,但我不知道问题出在哪里。我的代码是这样的:

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。

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

各位大神能解释一下吗?

【问题讨论】:

    标签: java parsing arraylist iterator


    【解决方案1】:

    您正在从内部循环内部的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 对吗?
    • @SimonMILHAU 中断打破了内部循环。假设您发布了内部循环的所有逻辑,它只包含一个条件,如果该条件为真,则调用 remove。一旦你调用了 remove,在内循环中就没有其他事情可做,所以 break 非常有意义。如果你的实际代码在内部循环中有额外的逻辑,你需要使用一些布尔变量(来确定是否调用remove)而不是break。
    • 谢谢@Eran,现在很清楚了,我认为问题出在糟糕的解析条件或类似的情况下,但现在我可以毫无例外地测试它!
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2013-03-27
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多