修复 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
。ag捕鱼王app官网的解决方案是使用一个 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
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
如何在 java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:java
-
本篇文章主要介绍如何在 java 中制造程序延迟。本教程介绍了如何在 java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 java 中把 hashmap 转换为 json 对象
发布时间:2023/12/17 浏览次数:187 分类:java
-
它描述了允许我们将哈希图转换为简单的 json 对象的方法。本文介绍了在 java 中把 hashmap 转换为 json 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 json 对象的详细例子。
如何在 java 中按值排序 map
发布时间:2023/12/17 浏览次数:171 分类:java
-
本文介绍了如何在 java 中按值对 map 进行排序。本教程介绍了如何在 java 中按值对 map
进行排序,并列出了一些示例代码来理解它。
如何在 java 中打印 hashmap
发布时间:2023/12/17 浏览次数:192 分类:java
-
本帖介绍了如何在 java 中打印 hashmap。本教程介绍了如何在 java 中打印 hashmap 元素,还列举了一些示例代码来理解这个主题。
在 java 中更新 hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:java
-
本文介绍了如何在 java 中更新 hashmap 中的一个值。本文介绍了如何在 java 中使用 hashmap 类中包含的两个方法-put() 和 replace() 更新 hashmap 中的值。
java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:java
-
本文介绍了 java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 java 中 map 和 hashmap 之间的主要区别。在 java 中,map 是用于以键值对存储数据的接口,
在 java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:java
-
这篇文章向你展示了如何在 java 中获取用户主目录。本教程介绍了如何在 java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:java
-
这篇文章教你如何知道 java 中大小和长度之间的区别。本教程介绍了 java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:java
-
了解有关 java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,