Java NoSuchElementException

标签 java exception nosuchelementexception

所以我有一个一年前编写的相当大的 java 应用程序,我试图再次理解它。我正在查看代码中的一个方法,其中明显存在出现 NoSuchElementException 的风险:我正在使用任意字符串构造的扫描仪变量上调用 .next() 。该方法唯一声明要抛出的是自定义的 Exception 子类。有风险的命令也没有写在 catch block 中。代码编译并工作正常,当我以这样的方式使用我的 gui 时,它应该抛出 NoSuchElementException 什么也没有发生:O

作为测试,我在代码中编写了一个 catch block ,编译它,运行 gui 并使其再次抛出 NoSuchElementException,应用程序成功捕获异常并采取相应的操作。我如何可以在不指定可能抛出此异常的情况下编译代码?如果有任何用处,这里是没有 catch block 的代码:

public static Expression interpret(final Scanner scanner)
  throws
    InvalidPosition,
    NoSuchSpreadsheet,
    IllegalStartOfExpression,
    InvalidExpression,
    FalseSyntax,
    InvalidRange {

String keyword = null;

try {
  keyword = scanner.next();
} catch (NoSuchElementException e) {
  throw new IllegalStartOfExpression();
}

switch(keyword) {
  case "Get":
    Position pos = PositionInterpreter.interpret(scanner.next());
    Expression expression = Application.instance.get(pos);
    if (expression instanceof Text) {
        System.out.println("Failure");
    } else { System.out.println("Success"); }
    return new Text(expression.toString());
  case "Int":
    return new Int(
      scanner.nextInt());

正如您所看到的,该方法在检查是否至少有一个单词后,简单地假设扫描仪中存在多个单词。我该如何编译这个?

最佳答案

这是因为 NoSuchElementException 是未经检查的异常,这意味着它“是一个”RuntimeException,它不会强制您捕获。

未经检查的异常类是 RuntimeException 类及其子类,以及 Error 类及其子类。所有其他异常类都是检查异常类。 Java API 定义了许多异常类,包括检查的和未检查的。程序员可以声明其他异常类(包括检查的和未检查的)。请参阅ref有关异常类层次结构以及 Java API 和 Java 虚拟机定义的一些异常类的描述。

运行时异常与检查异常具有相同的用途;向用户传达异常情况(意外故障等)。

检查异常强制方法的调用者处理该异常,即使他们不知道如何处理它。很多时候,开发人员最终会捕获受检查的异常,然后重新抛出它(或另一个异常)。因此运行时异常

这是异常层次结构

enter image description here

关于Java NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988765/

相关文章:

java - 如何定位列表元素(Selenium)?

java - StringUtils.isBlank 为空字符串返回 false

Java HttpClient 改变内容类型?

c# - 参数异常 "Item with Same Key has already been added"

未捕获 Java 异常

java - Selenium Webdriver 未找到此类元素

java - 我的 Java 代码中不断出现 NoSuchElement 异常。我的代码有什么问题吗?

java - Local.getCountry() 何时返回 UN M.49 3 位代码而不是 ISO 3166 2 字母代码?

java - Android Firebase数据库自动刷新更新2

java - Java中的迭代、concurrentModifcationException