有人告诉我,在Java中,未检查的异常可以在try块中捕获,但是如果它被捕获,它不是被称为检查过的异常吗?
发布于 2009-06-26 23:48:43
未检查的异常是不需要在try-catch块中捕获的异常。未检查的异常是RuntimeException或Error类的子类。
受控异常是需要在try-catch块中捕获的异常。
检查异常和未检查异常的定义可以在The Java Language Specification的Section 11.2: Compile-Time Checking of Exceptions中找到
未检查的异常类是类
RuntimeException及其子类,以及类Error及其子类。所有其他异常类都是选中的异常类。
在catch块中捕获未检查的异常并不能使其成为已检查的异常--它只是意味着未检查的异常已被捕获,并在catch块中进行了处理。
可以catch一个未检查的异常,然后throw一个新的已检查的异常,因此任何调用该方法的方法都可能发生未检查的异常,并强制调用它的方法处理某种类型的异常。
例如,在处理Integer.parseInt方法的一些无法解析的String时可能抛出的NumberFormatException是一个未检查的异常,因此不需要捕获它。但是,调用该方法的方法可能希望其调用者正确处理此类问题,因此它可能会抛出另一个被检查的异常(不是RuntimeException的子类):
public int getIntegerFromInput(String s) throws BadInputException {
int i = 0;
try {
i = Integer.parseInt(s);
catch (NumberFormatException e) {
throw new BadInputException();
}
return i;
}在上面的示例中,在try-catch块中捕获了一个NumberFormatException,并抛出了一个新的BadInputException (旨在成为一个已检查的异常)。
任何getIntegerFromInput方法的调用者都将被强制捕获一个BadInputException,并被迫处理错误的输入。如果NumberFormatException不被捕获和处理,则此方法的任何调用方都必须正确处理该异常。
(另外,应该注意,处理异常并做一些没有实际意义的事情并不是一种好的做法--在可以执行有意义的异常处理的情况下处理异常。)
来自Java教程:
示例
发布于 2009-06-27 00:00:15
不,它不会因为被捕获而被称为检查异常。可以编写catch块来捕获任何类型的异常或错误。受控异常是那些受Catch or Specify Requirement约束的异常,这意味着您需要捕获它们或声明您的方法可能会抛出它们。您可以将术语checked认为是指编译器将进行检查,以确保您遵守catch或specify要求。Errors和RuntimeExceptions被称为未检查异常,因为编译器不会对它们强制执行此要求。
发布于 2009-06-26 23:54:36
我认为区别在于编译器将标记未捕获的已检查异常和抛出已检查异常的方法,但不会在编译时在方法签名中声明它们。
未检查的异常不需要声明或捕获,但两者都不被禁止。编译器只是不会将它们识别为错误。
https://stackoverflow.com/questions/1051728
复制相似问题