所以这只是一个理解列表迭代器的虚拟程序。
我正在做的步骤

  • 创建了一个带有“A”和“B”的 ArrayList
  • 现在为此 ArrayList 创建了一个 listIterator
  • 如果找到“B”,则在其旁边添加“C”
  • 如果发现“A”有问题,则将其替换为“a”
  • 如果发现“B”有问题,则将其替换为“b”。

  • 代码:
    public class Main {
        public static void main(String[]  args) {
            ArrayList<String> al = new ArrayList<String>();
            al.add("A");
            al.add("B");
    
            ListIterator lItr = al.listIterator();
            while(lItr.hasNext()) {
            String s = (String)lItr.next();
            System.out.println(s);
            if(s.equals("B")) {
                lItr.add("C");
            }
            if(s.equals("A")) {
                lItr.set("a");
            }
            else if(s.equals("B")) {
                lItr.set("b");//Im getting an exception here saying
                                "java.lang.IllegalStateException"
            }
            }
            System.out.println(al);
        }
    }
    

    请任何人告诉我为什么我会收到此异常为什么我不能将“B”设置为 b。

    最佳答案

    documentation 清楚地说明了为什么会发生这种情况:



    你在调用 add 之前已经调用了 set ,对吧?

    if(s.equals("B")) {
        lItr.add("C"); // <-- here!
    }
    if(s.equals("A")) {
        lItr.set("a");
    }
    else if(s.equals("B")) {
        lItr.set("b"); // <-- and here
    }
    

    添加元素后,您将设置的元素会发生变化,因此这是不允许的。

    要解决此问题,只需在 add 之后执行 set :
     // Also use generic types properly!
    ListIterator<String> lItr = al.listIterator();
    while(lItr.hasNext()) {
        String s = lItr.next();
        System.out.println(s);
        if(s.equals("A")) {
            lItr.set("a");
            lItr.add("C"); // note the change here
        }
        else if(s.equals("B")) {
            lItr.set("b");
        }
    }
    

    关于java - Java的列表迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53627398/

    10-10 22:52