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

Ano*_*ous 8 java exception checked-exceptions

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

coo*_*ird 13

unchecked异常是不需要在被捕获的异常try- catch块.未经检查的异常是RuntimeExceptionError类的子类.

checked异常是需要在被捕获的异常try- catch块.

检查和unchecked异常的定义可参见第11.2节:编译时检查异常Java语言规范:

未经检查的异常类是类RuntimeException及其子类,以及类Error及其子类.所有其他异常类都是已检查的异常类.

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

可以catch是未经检查的异常,然后throw是新的已检查异常,因此任何调用该方法的方法都可能发生未经检查的异常,并强制调用它来处理某种异常的方法.

例如,NumberFormatException在处理方法的一些不可解析时可以抛出StringInteger.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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,a NumberFormatException被捕获在try- catch块中,并且BadInputException抛出了一个new (用于检查异常).

getIntegerFromInput方法的任何调用者都将被强制捕获BadInputException,并被迫处理不良输入.如果NumberFormatException不被捕获和处理,则此方法的任何调用者都必须正确处理异常.

(另外,应该注意的是,吃异常并做一些不重要的事情并不是一种好的做法 - 处理可以执行有意义的异常处理的异常.)

来自Java教程: