Итерация через перечисление hastable ключей бросает ошибку NoSuchElementException
Я пытаюсь выполнить итерацию по списку ключей из хэш-таблицы с использованием перечисления, однако я продолжаю получать исключение NoSuchElementException при последнем ключевом списке?
Hashtable<String, String> vars = new Hashtable<String, String>();
vars.put("POSTCODE","TU1 3ZU");
vars.put("EMAIL","[email protected]");
vars.put("DOB","02 Mar 1983");
Enumeration<String> e = vars.keys();
while(e.hasMoreElements()){
System.out.println(e.nextElement());
String param = (String) e.nextElement();
}
Выход консоли:
EMAIL
POSTCODE
Exception in thread "main" java.util.NoSuchElementException: Hashtable Enumerator
at java.util.Hashtable$Enumerator.nextElement(Unknown Source)
at testscripts.webdrivertest.main(webdrivertest.java:47)
Ответы
Ответ 1
Вы вызываете nextElement()
дважды в свой цикл. Этот вызов переводит указатель перечисления вперед.
Вы должны изменить свой код следующим образом:
while (e.hasMoreElements()) {
String param = e.nextElement();
System.out.println(param);
}
Ответ 2
for (String key : Collections.list(e))
System.out.println(key);
Ответ 3
Каждый раз, когда вы вызываете e.nextElement()
, вы берете следующий объект из итератора. Вы должны проверить e.hasMoreElement()
между каждым вызовом.
Пример:
while(e.hasMoreElements()){
String param = e.nextElement();
System.out.println(param);
}
Ответ 4
Вы вызываете следующий элемент дважды. Рефакторинг:
while(e.hasMoreElements()){
String param = (String) e.nextElement();
System.out.println(param);
}
Ответ 5
Вы вызываете e.nextElement()
дважды внутри своего цикла, когда вам гарантируется, что вы можете вызвать его один раз без исключения. Перепишите петлю так:
while(e.hasMoreElements()){
String param = e.nextElement();
System.out.println(param);
}
Ответ 6
Вы вызываете nextElement дважды в цикле. Вы должны называть его только один раз, иначе он перемещается вперед дважды:
while(e.hasMoreElements()){
String s = e.nextElement();
System.out.println(s);
}
Ответ 7
Каждый раз, когда вы делаете e.nextElement()
, вы пропускаете один. Таким образом, вы пропускаете два элемента на каждой итерации цикла.