Java Iterator пропускает элементы - PullRequest
0 голосов
/ 06 января 2019

Я заметил странное поведение при отладке через итератор: итератор пропустил некоторые элементы. Через некоторое время я понял, что часы отладки меняют значения переменных времени выполнения.

Тогда я получаю

Caused by: java.util.NoSuchElementException: null
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:721) ~[na:1.8.0_181]
at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742) ~[na:1.8.0_181]

enter image description here 2.

1 Ответ

0 голосов
/ 06 января 2019

Это не имеет ничего общего с наблюдателями отладки.

Это может помочь: из LinkedHashMap

В связанных хеш-картах с упорядоченным доступом простое обращение к карте с помощью get является структурной модификацией

при условии, что вы передаете true для упорядоченного доступа к конструктору связанного хеш-карты, что вызывает структурные изменения при каждой операции get.

ваше время

while(planetsIterator.hasNext() && ...) {
   Planet planet = planetsIterator.next();
   ...
}

компилируется в

Iterator<Planet> it = planetsIterator.keySet().iterator();
while (it.hasNext()) {
    String key = it.next();
    Planet planet = planetsIterator.get(key);
    ...
}

Таким образом, оператор get вызывает структурные изменения.

Вы можете работать с EntrySet, чтобы избежать этого поведения.

Обратите внимание, что эта реализация не синхронизирована. Таким образом, это не потокобезопасный.

...