如何在Java中修复Java .util.NoSuchElementException ?
扰乱程序正常流程的无例外、不需要的事件称为Exception 。大多数时候异常是由我们的程序引起的,这些都是可以恢复的。假设我们的程序要求是从位于美国的远程文件中读取数据 在运行时,如果远程文件不可用,那么我们将得到 RuntimeException 说 fileNotFoundException。如果发生fileNotFoundException,我们可以将本地文件提供给程序以正常读取并继续程序的其余部分。
java中的异常主要有以下两种:
1、受检异常:在运行时为了程序的顺利执行而被编译器检查的异常称为受检异常。在我们的程序中,如果有可能出现已检查异常,那么我们应该处理该检查异常(通过 try-catch 或 throws 关键字),否则我们将得到编译时错误。已检查异常的示例有ClassNotFoundException、IOException、SQLException等。
2. Unchecked Exception:未经编译器检查的异常,无论程序员是否处理这类异常,都称为unchecked 异常。未检查异常的示例有 ArithmeticException、ArrayStoreException 等。
Whether the exception is checked or unchecked every exception occurs at run time only if there is no chance of occurring any exception at compile time.
NoSuchElementException:
它是 RuntimeException 的子类,因此它是一个未经检查的异常。当我们尝试访问数组、集合或任何其他对象的内容时,此异常由 JVM 自动引发,并由 Enumeration、Iterator 或 Tokenizer 的访问器方法(例如 next() 或 nextElement() 或 nextToken() 给出)如果这些对象是空的,或者如果我们在到达对象末尾后试图获取下一个元素,那么我们将得到Java.util.NoSuchElementException。
在下面的示例中,我们尝试使用 Iterator 类的访问器方法 next() 来访问 HashMap,但由于 HashMap 为空,我们将得到 NoSuchElementException。
示例 1:
Java
// Java program to demonstrate the occurence of
// NoSuchElementException
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an hashmap object
HashMap map = new HashMap<>();
// creating an iterator
Iterator itr = map.keySet().iterator();
// trying to access the element
itr.next();
}
}
Java
// Java program to demonstrate the occurence of
// NoSuchElementException
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an vector object
Vector v = new Vector<>();
// creating an enumertor
Enumeration enumerator = v.elements();
// trying to access the element
enumerator.nextElement();
}
}
Java
// Java program to remove the occurence of
// NoSuchElementException by using hasNext()
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an hashmap object
HashMap map = new HashMap<>();
// creating an iterator
Iterator itr = map.keySet().iterator();
// checking the map object using .hasNext()
// method if it has elements to access
// or not before accessing the map using
// .next() method
while (itr.hasNext())
System.out.println(itr.next());
}
}
Java
// Java program to remove the occurence of
// NoSuchElementException by using hasMoreElements()
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an vector object
Vector v = new Vector<>();
// creating an enumertor
Enumeration enumerator = v.elements();
// Checking the vector object using
// hasMorelements method if it has elements
// to access or not before accessing the vector
// using .nextElement() method
while (enumerator.hasMoreElements())
System.out.println(enumerator.nextElement());
}
}
示例 2:这里我们尝试通过枚举器访问空向量对象的元素。
Java
// Java program to demonstrate the occurence of
// NoSuchElementException
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an vector object
Vector v = new Vector<>();
// creating an enumertor
Enumeration enumerator = v.elements();
// trying to access the element
enumerator.nextElement();
}
}
如何解决这个错误?
几乎所有访问器方法给出 NoSuchElementException 的类都包含它们各自的方法来检查对象是否包含更多元素。所以为了避免这个 NoSuchElementException 我们需要总是调用,
- Iterator.hasNext() 或
- Enumeration.hasMoreElements() 或
- 调用 next( ) 或 nextElement 或 nextToken() 方法之前的 hasMoreToken() 方法。
下面是上面语句的实现:
示例 1:
Java
// Java program to remove the occurence of
// NoSuchElementException by using hasNext()
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an hashmap object
HashMap map = new HashMap<>();
// creating an iterator
Iterator itr = map.keySet().iterator();
// checking the map object using .hasNext()
// method if it has elements to access
// or not before accessing the map using
// .next() method
while (itr.hasNext())
System.out.println(itr.next());
}
}
输出:
示例 2:
Java
// Java program to remove the occurence of
// NoSuchElementException by using hasMoreElements()
// import required packages
import java.io.*;
import java.lang.*;
import java.util.*;
// driver class
class Geek {
// main method
public static void main(String[] args)
{
// creating an vector object
Vector v = new Vector<>();
// creating an enumertor
Enumeration enumerator = v.elements();
// Checking the vector object using
// hasMorelements method if it has elements
// to access or not before accessing the vector
// using .nextElement() method
while (enumerator.hasMoreElements())
System.out.println(enumerator.nextElement());
}
}
输出: