有人告诉我,在Java中,可以在try块中捕获未检查的异常,但是如果捕获了它,就不称为已检查的异常吗?

最佳答案

未检查的异常是不需要在try-catch块中捕获的异常。未检查的异常是 RuntimeException Error 类的子类。

已检查的异常是需要在try-catch块中捕获的异常。

可以在Section 11.2: Compile-Time Checking of ExceptionsThe 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教程中:
  • Lessons: Exceptions
  • The Catch or Specify Requirement-讨论检查的异常。
  • Chained Exceptions-捕获异常并抛出新异常的实践,如上面的示例。
  • Unchecked Exceptions — The Controversy
  • 09-11 02:31
    查看更多