2015-06-22 4 views
-1

По Java API -Почему API java не позволяет нам добавлять и удалять вместе?

IllegalStateException - если ни рядом, ни предыдущие были вызваны, или удалить или добавить были вызваны после последнего вызова к следующему или предыдущему

remove() - Удаляет из списка последнего элемент, который был возвращен следующей() или предыдущей() (дополнительная операция). Этот вызов может быть сделан только один раз за вызов до следующего или предыдущего. Это можно сделать, только если add (E) не был вызван после последнего вызова следующего или предыдущего.

Поскольку каждый раз, когда мы призывая add и remove вместе он должен удалить последний элемент, добавленный add почему эта причина IllegalStateException

, например, в моем code-

  • вызова каждый раз перед тем next()remove()
  • также remove() не вызывается дважды без звонка next()

тогда почему существует java.lang.IllegalStateException по призванию add и remove вместе.

Мой ява код

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

после вызова next() итератор на следующий элемент.

, когда мы добавляем элемент, add() итератора движется вперед на последнем элементе добавил

тогда почему существует java.lang.IllegalStateException по призванию remove()

ответ

1

Вы читаете неправильную документацию: Вам необходимо прочитать ListIterator's javadoc.

Он говорит:

Броски:

...

IllegalStateException - если ни рядом, ни предыдущие были названы, или удалить или добавить были названы после последнего звонка к следующему или предыдущему

Теперь, если вы хотите повода, это довольно просто. Вы играете с курсорами.

После add или после remove, где находится ваш курсор? Вы находитесь в случае неуверенности. Это трудный вопрос, чтобы ответить, поэтому лучше показать неуверенность, выбросив исключение. Чтобы узнать это, вы должны позвонить hasNext или hasPrevious, который будет выполнять все вычисления снова.

+0

именно это мой вопрос, что это за состояние «неуверенности»? –

+1

Это когда курсор нельзя разместить нигде, потому что он не знает, хотите ли вы быть перед добавленным элементом, после добавленного элемента или после исходного элемента. То же самое для удаления, но с меньшим выбором. Чтобы удалить эту неуверенность, выполните новый вызов 'hasPrevious' /' hasNext'. –

0

Из Oracle документации:

Удаляет из списка последнего элемент, который был возвращен next() или previous() (дополнительная операция). Этот вызов может быть сделан только один раз за , для вызова следующего или предыдущего. Это можно сделать, только если add (E) не был , вызванным после последнего вызова следующего или предыдущего.

0

хорошо, я не знаю, почему это запрещено, но, как вы уже знаете, javadoc явно запрещает это.

однако вопрос почему вы хотите сделать что-то подобное? Единственное, что приходит мне на ум, это то, что вы хотите заменить текущий элемент (т. Е. Удалить и добавить вместо него). Однако вместо этого вы можете использовать set. См javadoc:

Заменяет последний элемент, возвращенный в следующем() или предыдущей() с указанного элемента (дополнительная работа).Этот вызов может быть выполнен только в том случае, если после последнего вызова ни один из них не удалил ни remove(), ни add (E).

+0

Вы можете описать, в какой ситуации вы «ограничены»? чего вы не можете достичь? вы можете называть 'remove' и' add', если вам действительно нужно. – sodik

+0

мое среднее с ограничением не было, мы ничего не можем добиться, я говорю о конкретном сценарии только для любопытства. –