📜  如何在Java中修复Java .util.NoSuchElementException ?

📅  最后修改于: 2022-05-13 01:54:35.141000             🧑  作者: Mango

如何在Java中修复Java .util.NoSuchElementException ?

扰乱程序正常流程的无例外、不需要的事件称为Exception 大多数时候异常是由我们的程序引起的,这些都是可以恢复的。假设我们的程序要求是从位于美国的远程文件中读取数据 在运行时,如果远程文件不可用,那么我们将得到 RuntimeException 说 fileNotFoundException。如果发生fileNotFoundException,我们可以将本地文件提供给程序以正常读取并继续程序的其余部分。

java中的异常主要有以下两种

1、受检异常:在运行时为了程序的顺利执行而被编译器检查的异常称为受检异常。在我们的程序中,如果有可能出现已检查异常,那么我们应该处理该检查异常(通过 try-catch 或 throws 关键字),否则我们将得到编译时错误。已检查异常的示例有ClassNotFoundException、IOException、SQLException等。

2. Unchecked Exception:未经编译器检查的异常,无论程序员是否处理这类异常,都称为unchecked 异常。未检查异常的示例有 ArithmeticException、ArrayStoreException 等。

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());
    }
}

输出: