Java ArrayList发生非法状态异常

Java ArrayList发生非法状态异常,java,arraylist,iterator,illegalstateexception,Java,Arraylist,Iterator,Illegalstateexception,我试图在我的系统中运行以下代码,但在执行此操作时遇到非法状态异常 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

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

 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());

    }
}
}

光标尚未移动到元素。您刚刚检查了是否存在元素

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

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

因此,修改后的代码如下所示

 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);

    }

光标尚未移动到元素。您刚刚检查了是否存在元素

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

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

因此,修改后的代码如下所示

 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);

    }

这是正确的实现,您不需要检查(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");
               }
           }
        }
        }
import java.util.*;
公共类ArraylistExample2
{
公共静态void main(字符串args[])引发异常
{
ArrayList al=新的ArrayList();
所有添加(“A”);所有添加(“B”);所有添加(“C”);
迭代器i=al.Iterator();
while(i.hasNext())
{
String元素=i.next();
如果(“B”。等于(元素))
{
i、 删除();
系统输出打印项次(“删除元素B”);
}
}
}
}

这是正确的实现,您不需要检查(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");
               }
           }
        }
        }
import java.util.*;
公共类ArraylistExample2
{
公共静态void main(字符串args[])引发异常
{
ArrayList al=新的ArrayList();
所有添加(“A”);所有添加(“B”);所有添加(“C”);
迭代器i=al.Iterator();
while(i.hasNext())
{
String元素=i.next();
如果(“B”。等于(元素))
{
i、 删除();
系统输出打印项次(“删除元素B”);
}
}
}
}

迭代集合并同时从集合中删除内容可能会在许多语言中导致问题。我不确定Java是否有这个问题,但请考虑一下。如果您使用的是Java8,您可以查看“过滤”。您可以选择列表,只保留非“B”的元素@byxor猜测,迭代器在这种情况下是安全的。状态为:“Throws:…
IllegalStateException
-如果尚未调用
next
方法”,则“迭代集合并同时从集合中删除内容可能会在许多语言中导致问题。我不确定Java是否有这个问题,但请考虑一下。如果您使用的是Java8,您可以查看“过滤”。您可以选择列表,只保留非“B”的元素@byxor猜测,迭代器在这种情况下是安全的。状态为:“Throws:…
IllegalStateException
-如果
下一个
方法还没有被调用,“非常感谢您的帮助。非常感谢您的帮助。”。