English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Почему возникает NoSuchElementException, и как его исправить в Java?

Почему возникает NoSuchElementException, и как его исправить в Java?

Исключения - это проблемы, возникающие в процессе выполнения программы (время выполнения ошибки). При возникновении исключения программа внезапно останавливается, и код после строки, генерирующей исключение, никогда не выполняется. Каждое исключение представлено своим собственным классом.

Причина NoSuchElementException

Это исключение времени выполнения, то есть оно возникает во время выполнения.

Если вы пытаетесь получить элемент из пустого объекта или использовать методы доступа 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();
   }
}

Run-time error

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

Почти все классы, методы которых вызывают 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
Основной учебник
Давай посмотрим, что вам понравится