有人告诉我,在Java中,可以在try块中捕获未检查的异常,但是如果捕获了它,就不称为已检查的异常吗?
最佳答案
未检查的异常是不需要在try
-catch
块中捕获的异常。未检查的异常是 RuntimeException
或 Error
类的子类。
已检查的异常是需要在try
-catch
块中捕获的异常。
可以在Section 11.2: Compile-Time Checking of Exceptions的The Java Language Specification中找到已检查和未检查异常的定义:
仅仅因为未检查的异常被捕获在catch
块中并不能使其成为已检查的异常-这仅意味着未检查的异常已被捕获并在catch
块中进行了处理。
可以先对未检查的异常进行catch
,然后对新的受检查的异常进行throw
,这样,任何调用该方法的方法都可能发生未经检查的异常,并强制调用该方法的方法处理某种异常。
例如,当对NumberFormatException
方法处理一些无法解析的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;
}
在上面的示例中,在
NumberFormatException
-try
块中捕获了catch
,并引发了一个新的BadInputException
(旨在作为已检查的异常)。调用
getIntegerFromInput
方法的任何调用者都将被强制捕获BadInputException
,并被迫处理错误的输入。如果不捕获并处理NumberFormatException
,则此方法的任何调用者都必须正确处理该异常。(还应注意,吃掉异常并做一些没有真正意义的事情不被认为是一种好习惯-在可以执行有意义的异常处理的情况下处理异常。)
从Java教程中: