Beheben den NoSuchElementException-Fehler in Java

Mohammad Irfan 12 Oktober 2023
  1. NoSuchElementException bei Verwendung von Iterator in Java
  2. NoSuchElementException bei Verwendung der Enumeration in Java
  3. NoSuchElementException bei der Verwendung von StringTokenizer in Java
  4. NoSuchElementException bei Verwendung der Scanner-Klasse in Java
Beheben den NoSuchElementException-Fehler in Java

Eine Ausnahme ist ein Ereignis, das während der Ausführung eines Programms auftritt. Der normale Programmablauf wird beeinträchtigt, wenn eine Ausnahme auftritt, und das Programm wird abnormal beendet. Dieses Tutorial behandelt java.util.NoSuchElementException und wie man damit in Java umgeht.

Die NoSuchElementException erbt von der RuntimeException-Klasse, was bedeutet, dass es sich um eine ungeprüfte Exception handelt. Ungeprüfte Ausnahmen werden vom Compiler nicht behandelt, da sie während der Laufzeit auftreten.

Die NoSuchElementException wird von der Scanner-Klasse, der Iterator-Schnittstelle, der Enumerator-Schnittstelle und der StringTokenizer-Klasse ausgelöst. Diese Klassen haben Accessor-Methoden, um das nächste Element aus einem Iterable abzurufen. Sie werfen NoSuchElementException, wenn das Iterable leer ist oder die maximale Grenze erreicht hat.

Schauen wir uns an, wie verschiedene Klassen NoSuchElementException auslösen.

NoSuchElementException bei Verwendung von Iterator in Java

Die Iterator-Schnittstelle hat eine Methode namens next(), die verwendet wird, um auf das nächste Element in der Iteration zuzugreifen. Wenn kein Element in der Sammlung ist, wird NoSuchElementException geworfen. Wir werden uns einige Beispiele ansehen.

Versuch, eine HashMap ohne Elemente zu iterieren:

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    // creating a hashmap with no element
    HashMap<String, Integer> h1 = new HashMap<>();
    // creating an iterator object
    Iterator i = h1.keySet().iterator();
    // trying to access element
    i.next();
  }
}

Ausgabe:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1599)
    at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1620)
    at MyClass.main(MyClass.java:9)

Die Methode next() wirft eine Ausnahme, weil die HashMap leer ist. Wir können die Methode hasNext() verwenden, um diese Ausnahme zu vermeiden; es gibt true zurück, wenn das Iterable mehr Elemente hat.

Wir sollten die Methode next() nur verwenden, wenn hasNext() True zurückgibt, um solche Ausnahmen zu vermeiden. Siehe das Beispiel unten.

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    // creating a hashmap with no element
    HashMap<String, Integer> h1 = new HashMap<>();
    // creating an iterator object
    Iterator i = h1.keySet().iterator();
    // trying to access element
    while (i.hasNext()) {
      i.next();
    }
  }
}

Dieser Code löst keine Ausnahme aus. Nehmen wir ein Beispiel mit einigen Elementen in der HashMap und iterieren die Elemente.

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    // creating a hashmap
    HashMap<String, Integer> h1 = new HashMap<>();
    h1.put("one", 1);
    h1.put("two", 2);
    // creating an iterator object
    Iterator i = h1.keySet().iterator();
    // trying to access element
    while (i.hasNext()) {
      System.out.println(i.next());
    }
  }
}

Ausgabe:

one
two

Ohne die Methode hasNext() hätte dieser Code eine Ausnahme ausgelöst, aber es funktioniert gut.

NoSuchElementException bei Verwendung der Enumeration in Java

In Java hat Enumeration eine Methode namens nextElement(), die das nächste Element der Aufzählung zurückgibt. Wenn kein Element zurückzugeben ist, wird eine NoSuchElementException ausgelöst.

Sehen Sie sich das folgende Beispiel an, in dem wir eine Aufzählung aus einer Liste erstellen.

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    ArrayList<String> animals = new ArrayList<>();
    animals.add(new String("elephant"));
    // creating enumeration object
    Enumeration en = Collections.enumeration(animals);
    System.out.println(en.nextElement()); // gets "elephant"
    System.out.println(en.nextElement()); // throws exception
  }
}

Ausgabe:

elephant

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:970)
    at java.base/java.util.Collections$3.nextElement(Collections.java:5440)
    at MyClass.main(MyClass.java:9)

Das hasElement() löst nach der Rückgabe des ersten Elements eine Ausnahme aus, da keine Elemente in der ArrayList übrig sind, auf die zugegriffen werden könnte. Wir können die Methode hasMoreElements() verwenden, um diese Situation zu vermeiden.

Diese Methode gibt true zurück, wenn es mehr Elemente in der Enumeration gibt, die bereitgestellt werden sollen; andernfalls wird false zurückgegeben. Wir können die Methode nextElement() nur aufrufen, wenn es mehr Elemente in der Aufzählung gibt.

Sehen Sie sich das folgende Beispiel an:

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    ArrayList<String> animals = new ArrayList<>();
    animals.add(new String("elephant"));
    // creating enumeration object
    Enumeration en = Collections.enumeration(animals);
    while (en.hasMoreElements()) {
      System.out.println(en.nextElement()); // gets "elephant"
    }
  }
}

Ausgabe:

elephant

NoSuchElementException bei der Verwendung von StringTokenizer in Java

In Java bietet die Klasse StringTokenizer zwei Methoden, nextToken() und nextElement(). Die Methode nextToken() gibt den nächsten Token (String-Typ) vom String-Tokenizer zurück, während die Methode nextElement wie nexttoken() ist, außer dass sie einen Objekttyp anstelle einer Zeichenfolge zurückgibt. Beide Methoden werfen die NoSuchElementException.

Siehe das Beispiel unten.

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    StringTokenizer st = new StringTokenizer(s);
    System.out.println(st.nextToken()); // gets I
    System.out.println(st.nextToken()); // gets Love
    System.out.println(st.nextToken()); // gets Delft
    System.out.println(st.nextToken()); // Throws exception
  }
}

Ausgabe:

I
Love
Delft

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:347)
    at MyClass.main(MyClass.java:9)

Wir können die Ausnahme mit den Methoden hasMoreTokens() und hasMoreElements() vermeiden. Beide Methoden geben true zurück, wenn mehr Token in der Zeichenkette des Tokenizers verfügbar sind. Wir sollten die Methode nextToken() nur aufrufen, wenn die Methode hasMoreTokens() True zurückgibt.

Siehe das Beispiel unten:

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    StringTokenizer st = new StringTokenizer(s);
    while (st.hasMoreTokens()) {
      System.out.println(st.nextToken());
    }
  }
}

Ausgabe:

I
Love
Delft

NoSuchElementException bei Verwendung der Scanner-Klasse in Java

Die Scanner-Klasse in Java bietet mehrere Hilfsmethoden wie next(), nextInt() usw. Während der Arbeit mit diesen Methoden können sie die NoSuchElementException auslösen. Wir werden sie hier besprechen.

  1. Angenommen, Sie haben zwei Scannerobjekte, die auf die Standardeingabe zugreifen. Schließt man eine davon und ruft mit der anderen eine Methode auf, wirft sie die NoSuchElementException. Siehe das Beispiel unten.
import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    Scanner s1 = new Scanner(System.in);
    Scanner s2 = new Scanner(System.in);
    s1.close();
    s2.next();
  }
}

Ausgabe:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at MyClass.main(MyClass.java:8)

Wenn wir den ersten Scanner schließen, schließt er den zugrunde liegenden InputStream; daher kann der zweite Scanner nicht vom selben InputStream lesen und wirft eine NoSuchElementException. Die Lösung besteht darin, ein Scannerobjekt zum Lesen der System.in-Eingabe zu verwenden.

  1. Angenommen, Sie lesen einen String oder eine Datei mit dem Scanner-Objekt. Wenn keine Zeile mehr zu lesen ist, wird eine Ausnahme angezeigt. Siehe das Beispiel unten.
import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    Scanner s1 = new Scanner(s);
    System.out.println(s1.nextLine());
    System.out.println(s1.nextLine());
  }
}

Ausgabe:

I Love Delft

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at MyClass.main(MyClass.java:7)

Um dieses Problem zu lösen, verwenden wir die Methode hasNextLine(), die einen booleschen Wert zurückgibt. Schau dir das Beispiel an.

import java.util.*;
public class Main {
  public static void main(String args[]) {
    String s = "I Love Delft";
    Scanner s1 = new Scanner(s);
    while (s1.hasNextLine()) {
      System.out.println(s1.nextLine());
    }
  }
}

Ausgabe:

I Love Delft

Verwandter Artikel - Java Error