java.util.nosuchelementException

时间:2020-02-23 14:35:17  来源:igfitidea点击:

java.util.NoSuchElementException是一个runtimeexception或者说出一个取消选中的一种,因此它不需要在构造函数或者方法的投掷块中声明。

java.util.NoSuchElementException当我们尝试访问堆中的底层数据结构时,通常会抛出,并且由不同的类抛出,它具有获取下一个元素或者下一个令牌的方法,如迭代器::下一个(),枚举:: nextElement(),stringTokenizer :: nextToken()。
示例当我们在没有实现条件的情况下迭代HashMap时,如果有任何元素或者不是任何元素,则java引发或者抛出此异常,现在这是我们在迭代器上调用下一个()之前使用hasnext()的原因。

java.util.nosuchelementException可以有多种方案。
让我们在示例的帮助下看下不同情况

场景1:在枚举的情况下

在枚举中,如果我们调用方法nextElederment(),并且没有枚举中存在的元素,则提出了此异常,请参阅下面的代码。
语法 :

package org.igi.theitroad;
import java.util.*;
 
class Main {
	public static void main(String args[]) {
		Hashtable hmap = new Hashtable();
		Enumeration enumer = hmap.elements();
		enumer.nextElement(); //java.util.NoSuchElementExcepiton 
								//because the enumeration is empty
	}
}

输出:

线程"main"java.util.nosuchelementException in java.util.collections $equentenumeration.nextElement.noxtElement(Ava:4270)在Main.main(main.java:7)

解决方案

通过使用调用方法检查它是否真正具有元素的条件 hasMoreElements()
代码:

package org.igi.theitroad;
import java.util.*;
 
class Main {
	public static void main(String args[]) {
		Hashtable hmap = new Hashtable();
		Enumeration enumer = hmap.elements();
		if (enumer.hasMoreElements()) {
       //java.util.NoSuchElementExcepiton handled by checking enumer.nextElement();
		}
	}
}

上面的程序将完全罚款,没有例外。

场景2:在迭代器的情况下

在迭代器中,如果我们调用Next()调用方法,并且迭代器中没有包含的元素,则提出此异常,请参阅下面的代码。

package org.igi.theitroad;
import java.util.*;
 
class Main {
 
	public static void main(String args[]) {
		HashMap hMap = new HashMap();
		Iterator itr = hMap.keySet().iterator();
		itr.next();
//java.util.NoSuchElementException here because iterator is //empty
	}
}

输出:

在java.util.hashmap $hashiterator.noxterator.noxtnode(hashmap.java:1447)java.util.hashmap $keyiterator.next(hashmap.java:1469)的java.util.hashmapeption .nosuchelementexception main.java:6)

解决方案

通过通过调用方法hasnext()来实现一个检查是否存在下一个元素的条件。
代码:

package org.igi.theitroad;
import java.util.*;
 
class Main {
	public static void main(String args[]) {
		HashMap hMap = new HashMap();
		Iterator itr = hMap.keySet().iterator();
		if (itr.hasNext())
			itr.next(); //java.util.NoSuchElementExcepiton handled
	}
}

现在,这在不抛出给定的异常的情况下运行。

场景3:在stringTokenizer的情况下

在stringTokenizer中,如果我们调用方法NextElederment()或者nextToken(),并且没有元素或者令牌存在,则提出此异常,请参阅下面的代码。

package org.igi.theitroad;
import java.util.StringTokenizer;
 
class Main {
 
	public static void main(String args[]) {
		StringTokenizer token = new StringTokenizer("", ":");
		System.out.println(token.nextToken());
	}
}

输出:

Exception in thread “main" java.util.NoSuchElementException at java.util.HashMap$HashIterator.nextNode(HashMap.java:1447) at java.util.HashMap$KeyIterator.next(HashMap.java:1469) at Main.main(Main.java:6)

解决方案

通过使用stringTokenizer hasMoreTokens() or hashMoreElements()在过程之前调用NextToken()或者NextElement()。
代码:

package org.igi.theitroad;
import java.util.StringTokenizer;
 
class Main {
	public static void main(String args[]) {
		StringTokenizer token = new StringTokenizer("", ":");
		while (token.hasMoreTokens()) //Exception Handled
			System.out.println(token.nextToken());
	}
 
}