Java中导致 NoSuchElementException 的不同场景
例外是程序执行期间发生的问题(运行时错误)。当发生异常时,程序会突然终止,并且生成异常的行之后的代码将永远不会执行。每个异常由其各自的类表示。
NosuchElement异常
这是运行时异常,即它在执行时发生。
如果您尝试从空对象获取元素,或者使用Enumeration,Iterator或tokenizer的访问器方法(例如next()或nextElement())访问集合,数组或其他对象的内容,则尝试在到达对象(集合,数组或其他对象)的末尾后获取下一个元素,将生成NoSuchElementException。
情景
Enumeration的nextElement()方法-Vector,HashTable等集合具有名为elements()的方法,该方法返回包含集合中所有元素的Enumeration(接口)对象。
使用此对象,可以使用nextElement()方法一个接一个地获取元素。
如果在空集合上调用此方法,或者在到达集合末尾后,将在运行时生成NosuchElementException。
示例
import java.util.Enumeration;
import java.util.Vector;
public class EnumExample {
public static void main(String args[]) {
//实例化向量
Vector<Integer< vec = new Vector<Integer>( );
//填充向量
vec.add(1254);
vec.add(4587);
//使用枚举检索元素
Enumeration<Integer> en = vec.elements();
System.out.println(en.nextElement());
System.out.println(en.nextElement());
//到达末尾后检索下一个元素
System.out.println(en.nextElement());
}
}运行时错误
1254 4587 Exception in thread "main" java.util.NoSuchElementException: Vector Enumeration at java.util.Vector$1.nextElement(Unknown Source) at MyPackage.EnumExample.main(EnumExample.java:18)
StringTokenizer的nextElement()和nextToken()方法-StringTokenizer类接受String和delimiter作为其构造函数之一的参数,每次出现给定的定界符时,将给定的String拆分为几个小标记。
此类的nextToken()和nextElement()方法返回令牌生成器中的下一个令牌。如果在空的Tokenizer对象上调用这些方法,或者在结束时调用NoSuchElementException,则在运行时将生成NoSuchElementException。
示例
import java.util.StringTokenizer;
public class StringTokenizerExample{
public static void main(String args[]) {
String str = "Hello how are you";
//实例化StringTokenizer类
StringTokenizer tokenizer = new StringTokenizer(str, " ");
//打印所有令牌
System.out.println(tokenizer.nextToken());
System.out.println(tokenizer.nextToken());
System.out.println(tokenizer.nextToken());
System.out.println(tokenizer.nextToken());
//到达终点后获得下一个令牌
tokenizer.nextToken();
tokenizer.nextElement();
}
}运行时错误
Hello how are you Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(Unknown Source) at MyPackage.StringTokenizerExample.main(StringTokenizerExample.java:16)
Iterator的next()方法-Java提供了Iterator和ListIterator类来检索集合对象的元素。Iterator和ListIterator的next()方法返回集合的下一个元素。
如果在空集合上调用这些方法,或者在结束时调用NoSuchElementException,则在运行时生成。
同样,如果在空对象上或在其声明位置调用此方法,则ListIterator的previous()方法将返回集合的前一个元素,并在运行时生成NoSuchElementException。
示例
import java.util.ArrayList;
import java.util.Iterator;
public class NextElementExample{
public static void main(String args[]) {
//实例化ArrayList对象
ArrayList<String> list = new ArrayList<String>();
//填充ArrayList
list.add("apples");
list.add("mangoes");
list.add("oranges");
//获取ArrayList的Iterator对象
Iterator it = list.iterator();
System.out.println(it.next());
System.out.println(it.next());
System.out.println(it.next());
//到达末尾后检索下一个元素
it.next();
}
}运行时错误
apples mangoes oranges Exception in thread "main" java.util.NoSuchElementException at java.util.ArrayList$Itr.next(Unknown Source) at MyPackage.NextElementExample.main(NextElementExample.java:19)
示例(previous()方法)
import java.util.ArrayList;
import java.util.ListIterator;
public class NextElementExample{
public static void main(String args[]) {
//实例化ArrayList对象
ArrayList<String> list = new ArrayList<String>();
//填充ArrayList
list.add("apples");
list.add("mangoes");
list.add("oranges");
//获取ArrayList的Iterator对象
ListIterator<String> it = list.listIterator();
it.next();
it.next();
it.next();
System.out.println(it.previous());
System.out.println(it.previous());
System.out.println(it.previous());
System.out.println(it.previous());
}
}输出结果
oranges mangoes apples Exception in thread "main" java.util.NoSuchElementException at java.util.ArrayList$ListItr.previous(Unknown Source) at MyPackage.NextElementExample.main(NextElementExample.java:22)