【问题标题】:List Iterator of JavaJava的列表迭代器
【发布时间】:2018-12-05 16:51:43
【问题描述】:

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

  1. 用“A”和“B”创建了一个 ArrayList
  2. 现在为这个 ArrayList 创建了一个 listIterator
  3. 如果发现“B”,则在其旁边添加“C”
  4. 如果发现“A”,则将其替换为“a”
  5. 如果发现“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。

【问题讨论】:

标签: java


【解决方案1】:

您正在调用lItr.add("C"),后跟lItr.set("b"),中间没有调用nextprevious

void java.util.ListIterator.set(Object e)

将 next 或 previous 返回的最后一个元素替换为指定的元素(可选操作)。 只有在最后一次调用 next 或 previous 之后既没有调用 remove 也没有调用 add 时,才能进行此调用

【讨论】:

    【解决方案2】:

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

    投掷:

    UnsupportedOperationException - 如果设置操作不受支持 通过这个列表迭代器

    ClassCastException - 如果指定元素的类阻止它 被添加到这个列表中

    IllegalArgumentException - 如果指定元素的某些方面 阻止它被添加到此列表中

    IllegalStateException - 如果 next 和 previous 都没有被调用, 或 remove 或 add 在最后一次调用 next 或之后被调用 上一个

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

    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
    }
    

    添加元素后,要设置的元素发生变化,这是不允许的。

    要解决此问题,只需在 set 之后执行 add

     // 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");
        }
    }
    

    【讨论】:

      【解决方案3】:

      根据 Java 文档 https://docs.oracle.com/javase/8/docs/api/java/util/ListIterator.html#set-E-

      空集(E e)

      将 next() 或 previous() 返回的最后一个元素替换为 指定元素(可选操作)。 只有在以下情况下才能进行此调用 在最后一次调用后既没有调用 remove() 也没有调用 add(E) 下一个或上一个。

      您调用lItr.add("C"),然后调用lItr.set("b"),中间没有调用next()or previous(),因为如果条件都在检查s.equals("B"),并且如果元素是“乙”。

      if(s.equals("B")) {
          lItr.add("C");
      }
      
      else if(s.equals("B")) {
          lItr.set("b");//Im getting an exception here saying
                          "java.lang.IllegalStateException"
      }
      

      出现此执行路径是因为您在第二个 IF 条件中没有 ELSE,如果元素是“B”,则这会使第三个 IF 条件在执行第一个 IF 之后运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-26
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2017-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多