是不是在try块中捕获的未经检查的异常在Java中检查了异常?

时间:2009-06-26 23:46:47

标签: java exception checked-exceptions

我被告知在Java中,未经检查的异常可以在try块中捕获,但如果它被捕获,是不是称为已检查异常?

3 个答案:

答案 0 :(得分:13)

未经检查的例外是不需要在try - catch块中捕获的例外情况。未经检查的例外是RuntimeExceptionError类的子类。

已检查的例外是需要在try - catch块中捕获的例外情况。

已检查和未检查的例外的定义可在Section 11.2: Compile-Time Checking of ExceptionsThe Java Language Specification中找到:

  

未经检查的异常类是   班级RuntimeException及其   子类,以及类Error和   它的子类。所有其他例外   类被检查异常类。

仅仅因为在catch块中捕获未经检查的异常不会使其成为已检查的异常 - 它只是意味着已捕获未经检查的异常,并且已在catch块中处理。 / p>

可以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教程:

答案 1 :(得分:4)

不,它不会因为被捕获而被称为已检查的异常。可以编写一个catch块来捕获任何类型的异常或错误。已检查的异常是受Catch or Specify Requirement约束的异常,意味着您必需要么捕获它们,要么声明您的方法可能会抛出异常。您可以将术语 checked 视为编译器将检查以确保您遵守catch或指定要求的含义。错误和RuntimeExceptions被称为未经检查的异常,因为编译器不对它们强制执行此要求。

答案 2 :(得分:1)

我认为区别在于编译器将标记未捕获的已检查异常和抛出已检查异常的方法,但在编译时不会在方法签名中声明它们。

未经检查的例外不需要声明或捕获,但两者都不被禁止。编译器只是不将它们识别为错误。