Beheben den NoSuchElementException-Fehler in Java
- NoSuchElementException bei Verwendung von Iterator in Java
- NoSuchElementException bei Verwendung der Enumeration in Java
- NoSuchElementException bei der Verwendung von StringTokenizer in Java
- NoSuchElementException bei Verwendung der Scanner-Klasse 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.
- 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.
- 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
- Adresse wird bereits verwendet JVM_Bind-Fehler in Java
- Android Java.Lang.IllegalStateException behoben: Methode der Aktivität konnte nicht ausgeführt werden
- Ausnahme im Hauptthread Java.Lang.ClassNotFoundException in IntelliJ IDEA
- Ausnahme im Hauptthread Java.Lang.NoClassDefFoundError
- Beheben Sie das Problem, dass Java nicht installiert werden kann. Es gibt Fehler in den folgenden Schaltern
- Beheben Sie den Fehler `Es wurde keine Java Virtual Machine gefunden` in Eclipse