我有一个很大的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());正如您所看到的,在检查是否至少有一个单词之后,该方法简单地假设扫描器中有多个单词。我怎么才能编译这篇文章呢?
发布于 2013-09-25 02:05:04
这是因为NoSuchElementException是未检查异常,这意味着它是一个不会强迫您捕获的RuntimeException。
未检查的异常类是类RuntimeException及其子类,以及类Error及其子类。所有其他异常类都是选中的异常类。Java API定义了许多异常类,包括选中的和未选中的。附加的异常类,包括选中的和未选中的,都可以由程序员声明。有关异常类层次结构和Java API和Java虚拟机定义的一些异常类的描述,请参阅ref。
Runtime exceptions的作用与检查异常的目的相同;向用户传达异常情况(意外故障等)。
检查异常会强制方法的调用者处理该异常,即使他们不知道如何处理它。通常情况下,开发人员最终会捕获被检查的异常,只是为了重新抛出它(或另一个异常)。因此就有了Runtime exceptions
下面是异常层次结构

发布于 2013-09-25 02:13:02
由于问题已经得到了回答,我想指出这是非常糟糕的设计,并且不是Scanner类的预期用途:
try {
keyword = scanner.next();
} catch (NoSuchElementException e) {
throw new IllegalStartOfExpression();
}您真正应该做的是询问扫描器是否有任何输入,然后才检索它,如下所示:
if(scanner.hasNext()) {
keyword = scanner.next();
}
else {
throw new IllegalStartOfExpression();
}这同样适用于导致您出现问题的线路:
if(scanner.hasNextInt()) {
return new Integer(scanner.nextInt());
}发布于 2013-09-25 02:07:26
java.util.NoSuchElementException是java.lang.RuntimeException的一个子类。不需要处理RuntimeException%s。在Java API文档中:
Java RuntimeException是这些异常的超类,这些异常可以在
虚拟机的正常操作期间抛出。
RuntimeException及其子类是未经检查的异常。如果未检查异常可以由方法或构造函数的执行抛出并传播到方法或构造函数边界之外,则不需要在方法或构造函数的throws子句中声明这些异常。
https://stackoverflow.com/questions/18988765
复制相似问题