[英]Isn't an unchecked exception that is caught in a try block a checked exception in Java?
有人告诉我,在Java中,未经检查的异常可以在try块中捕获,但如果它被捕获,是不是称为已检查异常?
未经检查的异常是不需要在try
- catch
块中捕获的异常。 未经检查的异常是RuntimeException
或Error
类的子类。
已检查的异常是需要在try
- catch
块中捕获的异常。
有关已检查和未检查异常的定义,请参见第11.2节:编译时检查 Java语言规范 的异常 :
未经检查的异常类是
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
新的BadInputException
(旨在作为已检查的异常)。
getIntegerFromInput
方法的任何调用者都将被强制捕获BadInputException
,并被迫处理错误的输入。 如果不捕获和处理NumberFormatException
则此方法的任何调用者都必须正确处理异常。
(另外,应该注意的是,吃异常并做一些不重要的事情并不是一种好的做法 - 处理可以执行有意义的异常处理的异常。)
来自Java教程:
不,它不会因为它被捕获而被称为已检查的异常。 可以编写一个catch块来捕获任何类型的异常或错误。 已检查的异常是受Catch或Specify Requirement约束的异常,这意味着您需要捕获它们或声明您的方法可能抛出它们。 你可以认为术语检查作为这意味着编译器会检查,以确保你坚持抓或指定要求的。 错误和RuntimeExceptions被称为未经检查的异常,因为编译器不对它们强制执行此要求。
我认为区别在于编译器将标记未捕获的已检查异常和抛出已检查异常的方法,但在编译时不会在方法签名中声明它们。
未经检查的例外不需要声明或捕获,但两者都不被禁止。 编译器只是不将它们识别为错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.