English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Почему возникает NoSuchElementException, и как его исправить в Java?
Исключения - это проблемы, возникающие в процессе выполнения программы (время выполнения ошибки). При возникновении исключения программа внезапно останавливается, и код после строки, генерирующей исключение, никогда не выполняется. Каждое исключение представлено своим собственным классом.
Это исключение времени выполнения, то есть оно возникает во время выполнения.
Если вы пытаетесь получить элемент из пустого объекта или использовать методы доступа Enumeration, Iterator или tokenizer (например, next() или nextElement()) для доступа к содержимому集合а, массива или другого объекта, то попытка получить следующий элемент после достижения конца объекта (коллекции, массива или другого объекта) генерирует NoSuchElementException.
Например:
Если метод nextElement() класса Enumeration вызывается на пустом объекте枚举, или если текущая позиция находится в конце Enumeration, то в процессе выполнения генерируется NoSuchElementException.
Если метод nextElement() или nextToken() класса StringTokenizer используется на пустом объекте StringTokenizer, или если текущая позиция находится в конце StringTokenizer, то в процессе выполнения генерируется NoSuchElementException.
Если метод next() класса Iterator или ListIterator вызывается на пустом Iterator / ListIterator, или если текущая позиция находится в конце, то в процессе выполнения генерируется NoSuchElementException.
Аналогично, если вызывается метод previous() класса ListIterator на пустом объекте ListIterator или если текущая позиция является началом ListIterator, то в время выполнения будет генерироваться NoSuchElementException.
import java.util.StringTokenizer; public class StringTokenizerExample{ public static void main(String args[]) { String str = "Hello how are you"; //Instantiating the StringTokenizer class StringTokenizer tokenizer = new StringTokenizer(str, " "); //Printing all the tokens System.out.println(tokenizer.nextToken()); System.out.println(tokenizer.nextToken()); System.out.println(tokenizer.nextToken()); System.out.println(tokenizer.nextToken()); //Получение следующего токена после достижения конца tokenizer.nextToken(); tokenizer.nextElement(); } }
Hello how are you Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(Unknown Source) at MyPackage.StringTokenizerExample.main(StringTokenizerExample.java:16)
Почти все классы, методы которых вызывают NoSuchElementException, содержат свои методы для проверки наличия дополнительных элементов в объекте (коллекции, генераторы токенов и т.д.).
Например,-
Класс Enumeration содержит метод hasMoreElements(), который возвращает true, если текущий объект в当前位置 содержит дополнительные элементы (в противном случае возвращает false).
Класс StringTokenizer содержит методы hasMoreTokens() и hasMoreElements(), которые возвращает true, если текущий объект в当前位置 содержит дополнительные элементы (в противном случае возвращает false).
Класс Iterator содержит метод hasNext(), который возвращает true, если текущий итератор в当前位置 содержит дополнительные элементы (в противном случае возвращает false).
Класс ListIterator содержит метод hasPrevious(), который возвращает true, если текущий итератор в当前位置 содержит дополнительные элементы (в противном случае возвращает false).
В цикле while используется эти методы для проверки наличия дополнительных элементов в соответствующем объекте, и элементы печатаются/доступны только при условии true. Когда объект пуст или достиг конца, это предотвращает использование методов доступа к элементам.
Метод hasMoreElements() класса Enumeration
import java.util.Enumeration; import java.util.Vector; public class EnumExample { public static void main(String args[]) { //instantiating a Vector Vector<Integer> vec = new Vector<Integer>( ); //Populating the vector vec.add(1254); vec.add(4587); //Retrieving the elements using the Enumeration Enumeration<Integer> en = vec.elements(); while(en.hasMoreElements()) { System.out.println(en.nextElement()); } } }
вывод результатов
1254 4587
Метод nextMoreTokens() класса StringTokenizer-
import java.util.StringTokenizer; public class StringTokenizerExample{ public static void main(String args[]) { String str = "Hello how are you"; //Instantiating the StringTokenizer class StringTokenizer tokenizer = new StringTokenizer(str, " "); //Printing all the tokens while(tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken()); } } }
вывод результатов
Hello how are you
Метод hasNext() класса Iterator-
import java.util.ArrayList; import java.util.Iterator; public class NextElementExample{ public static void main(String args[]) { //Создание объекта ArrayList ArrayList<String> list = new ArrayList<String>(); //заполнение ArrayList list.add("apples"); list.add("mangoes"); list.add("oranges"); //Получение объекта Итератора из ArrayList Iterator it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
вывод результатов
apples mangoes oranges
Метод hasPrevious() класса ListIterator-
import java.util.ArrayList; import java.util.ListIterator; public class NextElementExample{ public static void main(String args[]) { //Создание объекта ArrayList ArrayList<String> list = new ArrayList<String>(); //заполнение ArrayList list.add("apples"); list.add("mangoes"); list.add("oranges"); //Получение объекта Итератора из ArrayList ListIterator<String> it = list.listIterator(); while(it.hasNext()) { it.next(); } while(it.hasPrevious()) { System.out.println(it.previous()); } } }
вывод результатов
oranges mangoes apples