迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

修复 Java 中的 NoSuchElementException 错误

作者:迹忆客 最近更新:2023/11/13 浏览次数:

异常是在程序执行期间发生的事件。发生异常时会影响正常的程序流程,导致程序异常终止。本文将讨论 java.util.NoSuchElementException 以及如何在 Java 中处理它。

NoSuchElementException 继承自 RuntimeException 类,这意味着它是一个未经检查的异常。编译器不处理未经检查的异常,因为它们发生在运行时。

NoSuchElementExceptionScanner 类、Iterator 接口、Enumerator 接口和 StringTokenizer 类抛出。这些类具有访问器的方法来从可迭代对象中获取下一个元素。如果可迭代对象为空或已达到最大限制,它们会抛出 NoSuchElementException

让我们看看不同的类如何抛出 NoSuchElementException


在 Java 中使用迭代器时出现 NoSuchElementException

Iterator 接口有一个名为 next() 的方法,用于访问迭代中的下一个元素。如果集合中没有元素,则抛出 NoSuchElementException。我们将看一些例子。

尝试迭代没有元素的 HashMap

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    // creating a hashmap with no element
    HashMap<String, Integer> h1 = new HashMap<>();
    // creating an iterator object
    Iterator i = h1.keySet().iterator();
    // trying to access element
    i.next();
  }
}

输出:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1599)
    at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1620)
    at MyClass.main(MyClass.java:9)

next() 方法抛出异常,因为 HashMap 为空。我们可以使用 hasNext() 方法来避免这个异常;如果可迭代对象有更多元素,则返回 true。

只有当 hasNext() 返回 True 时,我们才应该使用 next() 方法,以避免此类异常。请参见下面的示例。

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    // creating a hashmap with no element
    HashMap<String, Integer> h1 = new HashMap<>();
    // creating an iterator object
    Iterator i = h1.keySet().iterator();
    // trying to access element
    while (i.hasNext()) {
      i.next();
    }
  }
}

此代码不会引发异常。让我们以 HashMap 中的一些元素为例并迭代这些元素。

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    // creating a hashmap
    HashMap<String, Integer> h1 = new HashMap<>();
    h1.put("one", 1);
    h1.put("two", 2);
    // creating an iterator object
    Iterator i = h1.keySet().iterator();
    // trying to access element
    while (i.hasNext()) {
      System.out.println(i.next());
    }
  }
}

输出:

one
two

如果没有 hasNext() 方法,这段代码会抛出异常,但它工作正常。


在 Java 中使用枚举时出现 NoSuchElementException

在 Java 中,Enumeration 有一个名为 nextElement() 的方法,它返回枚举的下一个元素。如果没有要返回的元素,它会抛出一个 NoSuchElementException

请看下面的示例,我们从列表中创建枚举。

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    ArrayList<String> animals = new ArrayList<>();
    animals.add(new String("elephant"));
    // creating enumeration object
    Enumeration en = Collections.enumeration(animals);
    System.out.println(en.nextElement()); // gets "elephant"
    System.out.println(en.nextElement()); // throws exception
  }
}

输出:

elephant

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:970)
    at java.base/java.util.Collections$3.nextElement(Collections.java:5440)
    at MyClass.main(MyClass.java:9)

hasElement() 在返回第一个元素后抛出异常,因为 ArrayList 中没有任何元素可供访问。我们可以使用 hasMoreElements() 方法来避免这种情况。

如果枚举中有更多元素要提供,则此方法返回 true;否则,它返回 false。只有当枚举中有更多元素时,我们才能调用 nextElement() 方法。

看下面的例子:

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    ArrayList<String> animals = new ArrayList<>();
    animals.add(new String("elephant"));
    // creating enumeration object
    Enumeration en = Collections.enumeration(animals);
    while (en.hasMoreElements()) {
      System.out.println(en.nextElement()); // gets "elephant"
    }
  }
}

输出:

elephant

在 Java 中使用 StringTokenizer 时出现 NoSuchElementException

在 Java 中,StringTokenizer 类提供了两个方法,nextToken()nextElement()nextToken() 方法从字符串标记器返回下一个标记(字符串类型),而 nextElement 方法与 nexttoken() 类似,只是它返回的是对象类型而不是字符串。这两种方法都会抛出 NoSuchElementException

请参见下面的示例。

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    StringTokenizer st = new StringTokenizer(s);
    System.out.println(st.nextToken()); // gets I
    System.out.println(st.nextToken()); // gets Love
    System.out.println(st.nextToken()); // gets Delft
    System.out.println(st.nextToken()); // Throws exception
  }
}

输出:

I
Love
Delft

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:347)
    at MyClass.main(MyClass.java:9)

我们可以使用 hasMoreTokens()hasMoreElements() 方法来避免异常。如果标记器的字符串中有更多标记可用,则这两种方法都返回 true。只有当 hasMoreTokens() 方法返回 True 时,我们才应该调用 nextToken() 方法。

请参见下面的示例:

import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    StringTokenizer st = new StringTokenizer(s);
    while (st.hasMoreTokens()) {
      System.out.println(st.nextToken());
    }
  }
}

输出:

I
Love
Delft

在 Java 中使用 Scanner 类时出现 NoSuchElementException

Java 中的 Scanner 类提供了几个实用方法,例如 next()、nextInt() 等。在使用这些方法时,它们可能会抛出 NoSuchElementException。我们将在这里讨论它们。

  1. 假设你有两个 Scanner 对象访问标准输入。如果你关闭其中一个并使用另一个调用方法,则会引发 NoSuchElementException。请参见下面的示例。
import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    Scanner s1 = new Scanner(System.in);
    Scanner s2 = new Scanner(System.in);
    s1.close();
    s2.next();
  }
}

输出:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at MyClass.main(MyClass.java:8)

当我们关闭第一个 Scanner 时,它会关闭底层的 InputStream;因此,第二个 Scanner 无法从同一个 InputStream 中读取数据并抛出 NoSuchElementException。解决方案是使用一个 Scanner 对象来读取 System.in 输入。

  1. 假设你正在使用 Scanner 对象读取字符串或文件。如果没有可读取的行,则会显示异常。请参见下面的示例。
import java.util.*;
public class MyClass {
  public static void main(String args[]) {
    String s = "I Love Delft";
    Scanner s1 = new Scanner(s);
    System.out.println(s1.nextLine());
    System.out.println(s1.nextLine());
  }
}

输出:

I Love Delft

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at MyClass.main(MyClass.java:7)

为了解决这个问题,我们使用返回布尔值的 hasNextLine() 方法。看例子。

import java.util.*;
public class Main {
  public static void main(String args[]) {
    String s = "I Love Delft";
    Scanner s1 = new Scanner(s);
    while (s1.hasNextLine()) {
      System.out.println(s1.nextLine());
    }
  }
}

输出:

I Love Delft

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便