【问题标题】:IllegalStateException (Unknown Source) when using iter.remove() in Java在 Java 中使用 iter.remove() 时出现 IllegalStateException(未知来源)
【发布时间】:2014-06-26 13:50:34
【问题描述】:

尝试从以下代码中的 ArrayList 中删除元素时,我收到了非法状态异常错误。我用谷歌搜索发现这个错误通常发生在代码中没有 iter.next() 时,但我很确定我的设置正确。

for (Iterator<String[]> x = PAuditjobslist.iterator(); x.hasNext(); ){

    String[] temp = x.next();

    if(temp.length > 2){

        String PAdate = dateFudger(temp[PAuditDate],f);
        int docCounter = 0;

        for(String[] y: cancelledjobslist){

            String Cndate = y[canJobDate];

            if(temp[PAuditName].equals(y[canJobName]) && PAdate.equals(Cndate) && 
                    documentNameList.get(docCounter).equals(temp[PAuditDocName]) ){

                x.remove();


            }
            docCounter++;
        }

    }   

}

这是我遇到的错误

Exception in thread "main" java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(Unknown Source)
at csvfilter.main(csvfilter.java:63)

【问题讨论】:

  • x.remove() 每个外循环只被调用一次吗?如果有疑问,请在删除后break
  • 是的,就是这样。在主列表中重复。谢谢

标签: java arraylist iterator


【解决方案1】:

我通常在循环外初始化迭代器并使用一段时间来代替,从未出现过该错误。

迭代器 itr = YOURLIST.iterator()

while (iterator.hasNext()) { ... }

【讨论】:

    【解决方案2】:

    Iterator#remove的文档中

    抛出IllegalStateException - 如果下一个方法尚未被调用,或者在最后一次调用下一个方法之后已经调用了 remove 方法。

    所以看起来x.remove() 在调用next() 之前被调用了两次。

    只需确保在调用x.remove() 后将break 退出内循环即可。

    【讨论】:

    • 在我的例子中,你引用的文字帮助了我,即“在最后一次调用下一个方法之后已经调用了 remove 方法。” :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2023-03-18
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多