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

Is IllegalStateException the same as NoSuchElementException in Java?

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.

Beispiel: Verschieben Sie zuLöschen Sie ein Element vor einem anderen Element

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();
   }
}

Laufzeitexception

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

Beispiel: Rufen Sie den next() -Methodenaufruf einmal auf und rufen Sie ihn dann zweimal auf

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();
}

Lösung

In diesem Fall müssen Sie den remove() -Methodenaufruf korrekt ausführen (nur einmal nach dem Aufruf von next()), um IllegalStateException zu lösen

Beispiel

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.

NoSuchElementException

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.

Beispiel

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();
   }
}

Laufzeitfehler

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)

Lösung

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).

Beispiel

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

Unterschied

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.