English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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)
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 необходимо вызывать метод, вызывающий исключение, в его законном месте.
Если вы пытаетесь получить элемент из пустого объекта, или использовать методы доступа 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.