修复 Java 中的 NoSuchElementException 错误
异常是在程序执行期间发生的事件。发生异常时会影响正常的程序流程,导致程序异常终止。本文将讨论 java.util.NoSuchElementException
以及如何在 Java 中处理它。
NoSuchElementException
继承自 RuntimeException
类,这意味着它是一个未经检查的异常。编译器不处理未经检查的异常,因为它们发生在运行时。
NoSuchElementException
由 Scanner
类、Iterator
接口、Enumerator
接口和 StringTokenizer
类抛出。这些类具有访问器的方法来从可迭代对象中获取下一个元素。如果可迭代对象为空或已达到最大限制,它们会抛出 NoSuchElementException
。
让我们看看不同的类如何抛出 NoSuchElementException
。
在 Java 中使用迭代器时出现 NoSuchElementException
Iterator
接口有一个名为 next()
的方法,用于访问迭代中的下一个元素。如果集合中没有元素,则抛出 NoSuchElementException
。我们将看一些例子。
尝试迭代没有元素的 HashMap
:
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();
}
}
输出:
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)
next()
方法抛出异常,因为 HashMap
为空。我们可以使用 hasNext()
方法来避免这个异常;如果可迭代对象有更多元素,则返回 true。
只有当 hasNext()
返回 True 时,我们才应该使用 next()
方法,以避免此类异常。请参见下面的示例。
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();
}
}
}
此代码不会引发异常。让我们以 HashMap
中的一些元素为例并迭代这些元素。
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());
}
}
}
输出:
one
two
如果没有 hasNext()
方法,这段代码会抛出异常,但它工作正常。
在 Java 中使用枚举时出现 NoSuchElementException
在 Java 中,Enumeration
有一个名为 nextElement()
的方法,它返回枚举的下一个元素。如果没有要返回的元素,它会抛出一个 NoSuchElementException
。
请看下面的示例,我们从列表中创建枚举。
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
}
}
输出:
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)
hasElement()
在返回第一个元素后抛出异常,因为 ArrayList 中没有任何元素可供访问。我们可以使用 hasMoreElements()
方法来避免这种情况。
如果枚举中有更多元素要提供,则此方法返回 true;否则,它返回 false。只有当枚举中有更多元素时,我们才能调用 nextElement()
方法。
看下面的例子:
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"
}
}
}
输出:
elephant
在 Java 中使用 StringTokenizer 时出现 NoSuchElementException
在 Java 中,StringTokenizer
类提供了两个方法,nextToken()
和 nextElement()
。nextToken()
方法从字符串标记器返回下一个标记(字符串类型),而 nextElement
方法与 nexttoken()
类似,只是它返回的是对象类型而不是字符串。这两种方法都会抛出 NoSuchElementException
。
请参见下面的示例。
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
}
}
输出:
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)
我们可以使用 hasMoreTokens()
和 hasMoreElements()
方法来避免异常。如果标记器的字符串中有更多标记可用,则这两种方法都返回 true。只有当 hasMoreTokens()
方法返回 True 时,我们才应该调用 nextToken()
方法。
请参见下面的示例:
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());
}
}
}
输出:
I
Love
Delft
在 Java 中使用 Scanner 类时出现 NoSuchElementException
Java 中的 Scanner 类提供了几个实用方法,例如 next()、nextInt() 等。在使用这些方法时,它们可能会抛出 NoSuchElementException
。我们将在这里讨论它们。
-
假设你有两个
Scanner
对象访问标准输入。如果你关闭其中一个并使用另一个调用方法,则会引发NoSuchElementException
。请参见下面的示例。
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();
}
}
输出:
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)
当我们关闭第一个 Scanner 时,它会关闭底层的 InputStream
;因此,第二个 Scanner 无法从同一个 InputStream
中读取数据并抛出 NoSuchElementException
。解决方案是使用一个 Scanner
对象来读取 System.in 输入。
-
假设你正在使用
Scanner
对象读取字符串或文件。如果没有可读取的行,则会显示异常。请参见下面的示例。
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());
}
}
输出:
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)
为了解决这个问题,我们使用返回布尔值的 hasNextLine()
方法。看例子。
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());
}
}
}
输出:
I Love Delft
相关文章
Java 中的 volatile 关键字
发布时间:2023/11/13 浏览次数:173 分类:Java
-
本文讨论了 Java 中的 volatile 关键字及其优缺点,并举例说明了如何使用。Java 是一种非常流行的编程语言,通过了解 Java,我们可以很容易地理解它为什么会在编程社区中获得这样的地位。
Java 中的 StringUtils
发布时间:2023/11/13 浏览次数:80 分类:Java
-
本文介绍 Java 中的 StringUtils 类是什么。本文介绍什么是 StringUtils 以及如何在 Java 中使用它来处理字符串。StringUtils 是一个用于处理 String 的类,它提供了比 Java String 类更多的实用方法。
Java 中的 flatMap
发布时间:2023/11/13 浏览次数:132 分类:Java
-
本文介绍 flatMap 以及如何在 Java 中使用它。本文介绍 flatMap 以及如何在 Java 中使用它。flatMap 是 Java 流中的一个操作/函数,用于在执行某些功能性任务后获取新流。在这里,我们将讨论 flatMap
在 Java 中将 Stream 元素转换为映射
发布时间:2023/11/13 浏览次数:77 分类:Java
-
我们将使用 Java 将流元素转换为映射。我们将向你展示如何使用 Collectors.toMap() 从 Java 字符串中提取映射。我们将讨论 Java Streams 的实际用途以及如何将流元素转换为映射元素。
Java 中的 findFirst 流方法
发布时间:2023/11/13 浏览次数:171 分类:Java
-
本教程介绍 Java 中的 findFirst 流方法。java.util.stream API 是在 Java 8 中引入的;它用于处理对象的集合。不同的源(例如数组或集合)可以创建流。
Java 中的 Stream 的 reduce 操作
发布时间:2023/11/13 浏览次数:147 分类:Java
-
本文介绍 Java 中 stream 的 reduce 操作。本文将讨论 reduce() 操作细节并讨论它的一些示例。在讨论 reduce() 操作之前。让我们首先讨论减少。
Java 中的 reflection 是什么
发布时间:2023/11/13 浏览次数:79 分类:Java
-
本文介绍了 reflection 以及如何在 Java 中使用它。本文介绍 reflection 以及如何在 Java 中使用它。Java 有一个 reflection API 特性,它允许我们检查和修改类、接口等。
修复 Java 未解决的编译错误
发布时间:2023/11/13 浏览次数:141 分类:Java
-
本文介绍如何修复 Java 中未解决的编译错误。Java 在三个组件上工作:JVM、JRE 和 JDK。JVM(Java 虚拟机)在物理上并不存在,它提供了运行字节码的环境。
修复 Java cannot be resolved to a variable 错误
发布时间:2023/11/13 浏览次数:64 分类:Java
-
修复 Java cannot be resolved to a variable 错误本指南将教你如何修复 Java 中的 cannot be resolved to a variable 错误。