有人告诉我,在 Java 中,未检查的异常可以在 try 块中捕获,但如果它被捕获,它不称为检查异常吗?
3 回答
未经检查的异常是不需要在try
-catch
块中捕获的异常。未经检查的异常是RuntimeException
or类的子Error
类。
已检查异常是需要在try
-catch
块中捕获的异常。
已检查和未检查异常的定义可以在第 11.2 节: Java 语言规范的异常的编译时检查中找到:
未经检查的异常类是类
RuntimeException
及其子类,以及类Error
及其子类。所有其他异常类都是检查异常类。
仅仅因为在块中捕获了未经检查的异常catch
并不使其成为已检查的异常——它只是意味着未经检查的异常被捕获并在catch
块中进行了处理。
一个可能catch
是未经检查的异常,然后throw
是新的已检查异常,因此任何调用该方法的方法都可能发生未经检查的异常,并强制调用它的方法处理某种异常。
例如,在处理一些无法解析的方法NumberFormatException
时可以抛出的 a which是未经检查的异常,因此不需要捕获它。但是,调用该方法的方法可能希望其调用者正确处理此类问题,因此它可能会抛出另一个经过检查的异常(不是 . 的子类):String
Integer.parseInt
RuntimeException
public int getIntegerFromInput(String s) throws BadInputException {
int i = 0;
try {
i = Integer.parseInt(s);
catch (NumberFormatException e) {
throw new BadInputException();
}
return i;
}
在上面的示例中,a在-块NumberFormatException
中被捕获,并抛出了一个 new (旨在成为已检查异常)。try
catch
BadInputException
该方法的任何调用者getIntegerFromInput
都将被迫捕获 a BadInputException
,并被迫处理错误的输入。如果NumberFormatException
不被捕获和处理,则此方法的任何调用者都必须正确处理异常。
(另外,应该注意的是,吃异常并做一些没有真正意义的事情并不被认为是一种好的做法——在可以执行有意义的异常处理的情况下处理异常。)
来自 Java 教程:
- 课程:例外
- Catch or Specify Requirement - 讨论检查的异常。
- 链式异常- 捕获异常并抛出新异常的做法,如上例所示。
- 未经检查的例外——争议
不,它不会仅仅因为它被捕获而被称为检查异常。可以编写一个 catch 块来捕获任何类型的异常或错误。已检查异常是受Catch 或 Specify Requirement约束的异常,这意味着您需要捕获它们或声明您的方法可能会抛出它们。您可以将术语检查视为意味着编译器将检查以确保您遵守捕获或指定要求。错误和运行时异常被称为未经检查的异常,因为编译器不对它们强制执行此要求。
我认为区别在于编译器将标记未捕获的检查异常和抛出检查异常但不在编译时在方法签名中声明它们的方法。
未经检查的异常不需要声明或捕获,但也不禁止。编译器只是不会将它们识别为错误。