【问题标题】:why java API prevents us to call add and remove together?为什么java API阻止我们一起调用add和remove?
【发布时间】:2015-09-07 15:14:57
【问题描述】:

根据Java API-

IllegalStateException - 如果在最后一次调用 next 或 previous 之后既没有调用 next 也没有调用 previous,或者 remove 或 add 没有被调用

remove()- 从列表中删除 next() 或 previous() 返回的最后一个元素(可选操作)。每次调用下一个或上一个时,此调用只能进行一次。只有在最后一次调用 next 或 previous 之后没有调用 add(E) 时才能进行。

因为每次我们同时调用addremove 时,它应该删除add 添加的最后一个元素,为什么会导致IllegalStateException

例如在我的代码中-

  • remove()之前每次调用next()
  • 同样remove()不会被调用两次而不调用next()

那为什么java.lang.IllegalStateException 会同时调用addremove

我的java代码是-

ListIterator<String> listIterator=list.listIterator();
    while(listIterator.hasNext()){
        System.out.println(listIterator.next());
        listIterator.add("Intel");
        listIterator.remove();
        //listIterator.remove();
    } 

在调用next()之后,迭代器在下一个元素处。

当我们通过add()添加元素时,迭代器在最后添加的元素处向前移动

那为什么在调用remove()时会有java.lang.IllegalStateException

【问题讨论】:

    标签: java list collections listiterator


    【解决方案1】:

    您阅读了错误的文档:您应该阅读ListIterator's javadoc

    上面写着:

    投掷:

    ...

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

    现在,如果你想要一个理由,那很简单。你在玩游标。

    addremove 之后,您的光标在哪里?你是在不确定的情况下。这是一个很难回答的问题,所以最好通过抛出异常来表明不确定性。要知道它,您必须调用hasNexthasPrevious,它们将再次执行所有计算。

    【讨论】:

    • 这正是我的问题,incertitude 状态是什么?
    • 这是当光标不能放在任何地方的时候,因为它不知道你是想在添加的元素之前,在添加的元素之后还是在初始元素之后。删除相同,但选择较少。因此,要消除这种不确定性,请重新调用 hasPrevious/hasNext
    【解决方案2】:

    好吧,我不知道为什么它被禁止,但正如你已经知道的那样,javadoc 明确禁止这样做。

    然而问题是为什么想要做这样的事情?我唯一想到的是你想替换当前元素(即删除并添加而不是它)。但是,您可以改用set。见javadoc

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

    【讨论】:

    • 您能描述一下您在哪种情况下受到“限制”吗?你无法实现什么?如果您真的需要,可以致电removeadd
    • 我的意思是限制不是我们无法实现任何事情,我只是出于好奇而谈论特定场景。
    【解决方案3】:

    来自 Oracle 文档:

    从列表中删除 next() 返回的最后一个元素,或者 previous()(可选操作)。此呼叫每次只能拨打一次 呼叫下一个或上一个。只有当 add(E) 没有被 在最后一次调用 next 或 previous 之后调用。

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2021-03-13
      • 1970-01-01
      • 2019-02-15
      • 2014-12-07
      • 2013-10-06
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      相关资源
      最近更新 更多