English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
IlleagalStateException wird generiert, wenn Sie Methodenaufrufe in illegalen oder unangemessenen Zeiten ausführen.
Beispielsweise löscht der remove() -Methodenaufruf der ArrayList-Klasse den letzten Element nach dem Aufruf von next() oder Previous.
Nachdem Sie das Element an der aktuellen Position gelöscht haben, müssen Sie zum nächsten Element navigieren, um es zu löschen, d.h. Sie können den remove() -Methodenaufruf nur einmal pro Aufruf von next() aufrufen.
Da der Anfangspunkt der Liste (Zeiger) vor dem ersten Element liegt, kann dieser Methodenaufruf nicht aufgerufen werden, wenn der nächste Methodenaufruf nicht aufgerufen wird.
Wenn Sie den remove() -Methodenaufruf aufrufen, wird sonst java.lang.IllegalStateException ausgelöst.
import java.util.ArrayList; import java.util.ListIterator; public class NextElementExample{ public static void main(String args[]) { //Instanziieren Sie das ArrayList-Objekt ArrayList<String> list = new ArrayList<String>(); //Füllen Sie die ArrayList list.add("Äpfel"); list.add("Mangoen"); //Erhalten Sie das Iterator-Objekt der ArrayList ListIterator<String> it = list.listIterator(); //Verschieben Sie das Element an die erste Position 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[]) { //Instanziieren Sie das ArrayList-Objekt ArrayList<String> list = new ArrayList<String>(); //Füllen Sie die ArrayList list.add("Äpfel"); list.add("Mangoen"); //Erhalten Sie das Iterator-Objekt der ArrayList ListIterator<String> it = list.listIterator(); //Verschieben Sie das Element an die erste Position it.next(); it.remove(); it.remove(); } }
Ausgaberesultat
Exception in thread "main" java.lang.IllegalStateException at java.util.ArrayList$Itr.remove(Unknown Source) at MyPackage.NextElementExample.main(NextElementExample.java:17)
In diesem Fall wird auch versucht, diesen Methodenaufruf im Zyklus auszuführen.
it.next(); while(it.hasNext()) { it.remove(); }
In diesem Fall müssen Sie den remove() -Methodenaufruf korrekt ausführen (nur einmal nach dem Aufruf von next()), um IllegalStateException zu lösen
import java.util.ArrayList; import java.util.Arrays; import java.util.ListIterator; public class NextElementExample{ public static void main(String args[]) { //Erzeugen eines ArrayList-Objekts ArrayList<String> list = new ArrayList<String>(); //Beschaffung der ArrayList list.add("Äpfel"); list.add("Mangoen"); //Beschaffung des Iterator-Objekts der ArrayList ListIterator<String> it = list.listIterator(); //Entfernen des Elements ohne zum ersten Position zu bewegen System.out.println(Arrays.toString(list.toArray())); while(it.hasNext()) { it.next(); it.remove(); } System.out.println(Arrays.toString(list.toArray())); } }
Ausgaberesultat
[Äpfel, Mangoen] []
Gleichzeitig müssen Sie in jedem Fall, in dem Sie eine IllegaleStateException behandeln müssen, die Methode, die den Ausnahmezustand verursacht, an ihrer rechtmäßigen Position aufrufen.
Wenn Sie versuchen, ein Element aus einem leeren Objekt zu erhalten oder den Inhalt einer Sammlung, eines Arrays oder eines anderen Objekts über die Zugriffsmethoden von Enumeration, Iterator oder tokenizer (z.B. next() oder nextElement()) abzurufen, wird eine NoSuchElementException generiert, wenn versucht wird, nach Erreichen des Endes des Objekts (Sammlung, Array oder anderes Objekt) den nächsten Element zu erhalten.
Zum Beispiel,
Wenn auf einem leeren Enumeration-Objekt die Methode nextElement() der Enumeration-Klasse aufgerufen wird oder wenn sich die aktuelle Position am Ende der Enumeration befindet, wird bei der Laufzeit eine NoSuchElementException generiert.
Wenn auf einem leeren StringTokenizer-Objekt die Methoden nextElement() und nextToken() der StringTokenizer-Klasse aufgerufen werden oder wenn sich die aktuelle Position am Ende des StringTokenizer befindet, wird bei der Laufzeit eine NoSuchElementException generiert.
wenn die Methode next() der Klasse Iterator oder ListIterator auf einem leeren Iterator / aufgerufen wird, oder wenn die aktuelle Position am Ende liegt, ein Iterator / ListIterator NosuchElementException.
Ähnlich wird bei Aufruf der Methode previous() der Klasse ListIterator auf einem leeren ListIterator-Objekt oder wenn die aktuelle Position am Anfang des ListIterator liegt, ein NoSuchElementException im Laufzeitfehler generiert.
Lassen Sie uns ein vollständiges Beispiel für eine Situation betrachten
import java.util.StringTokenizer; public class StringTokenizerExample{ public static void main(String args[]) { String str = "Hallo how are you"; //Instantiierung der StringTokenizer-Klasse StringTokenizer tokenizer = new StringTokenizer(str, " "); //Drucke alle Tokens System.out.println(tokenizer.nextToken()); System.out.println(tokenizer.nextToken()); System.out.println(tokenizer.nextToken()); System.out.println(tokenizer.nextToken()); //Das Erhalten des nächsten Tokens nach dem Erreichen des Endes tokenizer.nextToken(); tokenizer.nextElement(); } }
Hallo how are you Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(Unknown Source) at MyPackage.StringTokenizerExample.main(StringTokenizerExample.java:16)
fast alle Klassen, deren Zugriffsmethoden NoSuchElementException verursachen, enthalten eigene Methoden, um zu überprüfen, ob das Objekt (Sammlung, Token-Generator usw.) weitere Elemente enthält.
Zum Beispiel,
Die Klasse Enumeration enthält die Methode hasMoreElements(), die true zurückgibt, wenn das aktuelle Objekt nach seiner aktuellen Position weitere Elemente enthält (sonst false).
Die Klasse StringTokenizer enthält die Methoden hasMoreTokens() und hasMoreElements(), die true zurückgeben, wenn das aktuelle Objekt nach seiner aktuellen Position weitere Elemente enthält (sonst false).
Die Klasse Iterator enthält die Methode hasNext(), die true zurückgibt, wenn der aktuelle Iterator neben seiner aktuellen Position weitere Elemente enthält (sonst false).
Die Klasse ListIterator enthält die Methode hasPrevious(), die true zurückgibt, wenn der aktuelle Iterator vor seiner aktuellen Position weitere Elemente enthält (sonst false).
import java.util.StringTokenizer; public class StringTokenizerExample{ public static void main(String args[]) { String str = "Hallo how are you"; //Instantiierung der StringTokenizer-Klasse StringTokenizer tokenizer = new StringTokenizer(str, " "); //Drucke alle Tokens while(tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken()); } } }
Ausgaberesultat
Hallo how are you
Der Hauptunterschied zwischen diesen Ausnahmen ist, dass eine IllegalStateException generiert wird, wenn Sie eine Methode an einem ungültigen Ort im Programm aufrufen.
Wenn Sie versuchen, auf die Elemente von Enumeration, Iterator, StringTokenizer usw. zuzugreifen (durch den Zugriff auf Methoden), wird ein NoElementException generiert, wenn keine weiteren Elemente vorhanden sind.