Java NoSuchElementException

use*_*804 2 java exception-handling 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());
Run Code Online (Sandbox Code Playgroud)

如您所见,该方法只是假设在检查是否存在至少一个单词后,扫描仪中有多个单词.我怎么逃避编译呢?

cod*_*Man 7

原因NoSuchElementException 是未经检查的异常,这意味着它是"is-a" RuntimeException,它不会强迫你捕获.

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

Runtime exceptions与检查的例外服务目的相同; 向用户传达异常情况(意外故障等).

checked异常强制方法的调用者处理该异常,即使他们不知道如何处理它.通常情况下,开发人员最终会捕获已检查的异常,只会重新抛出异常(或其他异常).因此Runtime exceptions

这是异常层次结构

在此输入图像描述