所以我有一个一年前编写的相当大的 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 虚拟机定义的一些异常类的描述。
运行时异常
与检查异常具有相同的用途;向用户传达异常情况(意外故障等)。
检查异常强制方法的调用者处理该异常,即使他们不知道如何处理它。很多时候,开发人员最终会捕获受检查的异常,然后重新抛出它(或另一个异常)。因此运行时异常
这是异常层次结构
关于Java NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988765/