2014-01-30 2 views
2

Я знаю, что итераторы failfast проверяют ConcurrentModificationException на основе наилучших усилий. Почему методы, такие как hasnext или hasPrevious, не проверяют на ConcurrentModificationException и бросают его ???Почему doesnt hasnext, hasprevious и т. Д. Методы проверки Iterator или listIterator для ConcurrentModificationException

Следующий код работает хорошо для точной причины, что эти методы не проверены на CME, хотя это было конструктивно доработан

public static void main(String[] args) { 
     // TODO Auto-generated method stub 


     List<String> lilong = new ArrayList<String>(); 
     lilong.add("Queen"); 
     for(Iterator<String> iter =lilong.iterator();iter.hasNext();) 
     { 
      System.out.println(iter.next()); 
      lilong.add("King"); 
      lilong.remove(0); 
      lilong.add("Star"); 
      lilong.remove(0); 
      lilong.add("Sun"); 
      lilong.remove(0); 
      lilong.add("Polar Bear"); 
      lilong.clear(); 

      lilong.add("There you go"); 

     } 
     System.out.println("size="+ lilong.size()+"##element##"+lilong.iterator().next()); 
    } 
+0

Я не вижу здесь итераторов. – Maroun

+1

Итератор скрыт в каждом утверждении. – Kayaman

+0

@ Kayaman Я имею в виду ['iterator()'] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#iterator()). – Maroun

ответ

1

hasNext для итератора ArrayList не проверить изменения, он только смотрит на размер.

Если вы поместите еще один элемент в свой список, вы попадете на вторую итерацию, а затем next потерпит неудачу, как ожидалось.

Что касается того, почему это реализовано таким образом ... +1 на ваш вопрос.

+0

Да, но он мог бы проверить этот метод, используемый методами next() и remove(): - final void checkForComodification() { if (modCount! = ExpectedModCount) throw new ConcurrentModificationException(); } это вызвано методами remove() и next(), но не с методами hasnext() –

+0

«да, но он мог бы проверить». Правда. Но это не так. – Thilo

1

Edit: Удален груз дерьма

Поэтому вопрос is: почему не hasNext() проверить на одновременную модификацию, как и другие методы Iterator.

Если у меня есть предположение, hasNext() не имеет большого смысла, если только next() сразу после. Поэтому вместо проверки в 2-х местах это всего лишь next().

+0

Да .. что точка. Если он проверял исключение для одновременной модификации для метода hasNext(), это могло бы быть и для этого случая. Итераторы проверяют CME только для next() и remove() –

+0

@AbhinavKumar Я не уверен, что ваш код пытается показать. Даже если hasNext() проверен для CME, код примера будет работать так же, как сейчас. – Kayaman

+0

Мне нужно заменить мой код на конструкцию итератора, только тогда я буду более ясным –

Смежные вопросы