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

IlleagalStateException и NoSuchElementException в Java?

IlleagalStateException возникает при вызове метода в незаконное или неподходящее время.

Например, метод remove() класса ArrayList удаляет последний элемент после вызова метода next() или Previous.

  • После удаления элемента в текущем положении вам нужно переместиться к следующему элементу, чтобы удалить его, то есть, вы можете вызвать метод remove() только один раз при каждом вызове метода next().

  • Поскольку начальное положение списка (указатель) будет перед первым элементом, этот метод не может быть вызван, если не вызвать следующий метод.

Если вызвать метод remove(), в противном случае будет вызван java.lang.IllegalStateException.

Пример: переместитьЭтапудаление элемента до другого элемента

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");
      //Получить объект Iterator для ArrayList
      ListIterator<String> it = list.listIterator();
      //Переместить элемент в первое положение
      it.remove();
   }
}

Время выполнения исключения

Exception in thread "main" java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(Unknown Source)
at MyPackage.NextElementExample.main(NextElementExample.java:17)

Пример: вызов метода next() один раз, а затем два раза

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");
      //Получить объект Iterator для ArrayList
      ListIterator<String> it = list.listIterator();
      //Переместить элемент в первое положение
      it.next();
      it.remove();
      it.remove();
   }
}

Результат вывода

Exception in thread "main" java.lang.IllegalStateException
   at java.util.ArrayList$Itr.remove(Unknown Source)
   at MyPackage.NextElementExample.main(NextElementExample.java:17)

В этом случае также пытайтесь вызвать этот метод в цикле.

it.next();
while(it.hasNext()) {
   it.remove();
}

Раздел:

В указанном случае, чтобы решить проблему IllegalStateException, вам нужно правильно вызвать метод remove() (только после вызова next() один раз)

Пример

import java.util.ArrayList;
import java.util.Arrays;
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");
      //Получение объекта Iterator для ArrayList
      ListIterator<String> it = list.listIterator();
      //Удаляем элемент без перехода к начальной позиции
      System.out.println(Arrays.toString(list.toArray()));
      while(it.hasNext()) {
         it.next();
         it.remove();
      }  
      System.out.println(Arrays.toString(list.toArray()));
   }
}

Результат вывода

[apples, mangoes]
[]

Аналогично, в каждом случае для обработки исключения IllegaleStateException необходимо вызывать метод, вызывающий исключение, в его законном месте.

NoSuchElementException

Если вы пытаетесь получить элемент из пустого объекта, или использовать методы доступа Enumeration, Iterator или tokenizer (например, next() или nextElement()), чтобы получить содержимое集合а, массива или другого объекта, то попытка получить следующий элемент после достижения конца объекта (списка, массива или другого объекта) вызовет исключение NoSuchElementException.

Например:

  • Если вызывается метод nextElement() класса Enumeration на пустом объекте Enumeration, или если текущая позиция находится в конце Enumeration,则在 выполнении возникает исключение NoSuchElementException.

  • Если вызывается метод nextElement() или nextToken() класса StringTokenizer на пустом объекте StringTokenizer, или если текущая позиция находится в конце StringTokenizer,则在 выполнения возникает исключение NoSuchElementException.

  • Если метод next() класса Iterator или ListIterator вызывается на пустом Iterator / ListIterator, или если текущая позиция находится в конце, то в режиме выполнения будет сгенерирован NoSuchElementException для Iterator / listIterator.

  • Если на пустом объекте ListIterator вызывается метод previous() класса ListIterator, или если текущая позиция является началом ListIterator, то в режиме выполнения будет сгенерирован NoSuchElementException.

Пример

Давайте рассмотрим полный пример одной из таких ситуаций

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Привет как ты";
      //Создание экземпляра класса StringTokenizer
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //Вывод всех токенов
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      //Получение следующего токена после достижения конца
      tokenizer.nextToken();
      tokenizer.nextElement();
   }
}

Ошибка выполнения

Привет
как
ты
ты
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).

Пример

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Привет как ты";
      //Создание экземпляра класса StringTokenizer
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //Вывод всех токенов
      while(tokenizer.hasMoreTokens()) {
         System.out.println(tokenizer.nextToken());
      }
   }
}

Результат вывода

Привет
как
ты
ты

Различие

Основное различие между этими исключениями заключается в том, что при вызове метода в незаконном месте в программе генерируется исключение IllegalStateException.

Если вы пытаетесь получить элементы Enumeration, Iterator, StringTokenizer и т.д. (используя методы доступа), при отсутствии элементов в них генерируется исключение NoElementException.

Рекомендуется к просмотру