【问题标题】:Illegal state Exception Occurring with ArrayList [duplicate]ArrayList 发生非法状态异常 [重复]
【发布时间】:2018-06-15 07:42:01
【问题描述】:

我试图在我的系统中运行以下代码,但在执行此操作时遇到了非法状态异常。

 import java.util.*;
 public class ArraylistExample2 
 {

    public static void main(String args[])throws Exception
    {
      ArrayList <String> al = new ArrayList<String>();
      al.add("A");al.add("B");al.add("C");

      Iterator <String> i = al.iterator();
      while(i.hasNext())
      {
         if(al.contains("B"))
        {
            i.remove();
            System.out.println(" Element B removed");
        }
        System.out.println(i.next());

    }
}
}

有人可以解释一下这里的代码有什么问题,或者什么方法被非法调用导致了这个异常吗?下面是堆栈跟踪:

     java.lang.IllegalStateException
     at java.util.ArrayList$Itr.remove(ArrayList.java:864)
     at collectionsExamples.ArraylistExample2.main(ArraylistExample2.java:17)

【问题讨论】:

  • 迭代集合并同时从中删除内容可能会导致多种语言出现问题。我不确定Java是否有这个问题,但请考虑一下。
  • 如果您使用的是 java 8,您可以查看“过滤”。你可以拿你的清单,只保留不是“B”的元素。 mkyong.com/java8/java-8-streams-filter-examples
  • @byxor 猜猜,迭代器在这种情况下是安全的。
  • documentation 声明:“抛出: ...IllegalStateException - 如果尚未调用 next 方法”

标签: java arraylist iterator illegalstateexception


【解决方案1】:

光标还没有移动到元素上。您刚刚检查了是否存在元素。

在实际开始迭代之前,您正在从迭代器中删除一个元素。因此,迭代器中没有要删除的当前元素。

首先将光标移动到下一个元素,如果条件匹配,则尝试将其删除。

所以,修改后的代码看起来像

 while(i.hasNext())
      {
         Strng s = i.next(); // note this
         if(al.contains("B"))
        {
            i.remove();
            System.out.println(" Element B removed");
        }
        System.out.println(s);

    }

【讨论】:

  • 非常感谢您的帮助。
【解决方案2】:

这里是正确的实现,你不需要检查 if(al.contains("B")) 而是检查元素值是否为 B

                import java.util.*;
        public class ArraylistExample2 
        {

           public static void main(String args[])throws Exception
           {
             ArrayList <String> al = new ArrayList<String>();
             al.add("A");al.add("B");al.add("C");

             Iterator <String> i = al.iterator();
             while(i.hasNext())
             {
                 String element=i.next();
                if("B".equals(element))
               {
                   i.remove();
                   System.out.println(" Element B removed");
               }
           }
        }
        }

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2020-04-29
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多