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)