java - 在 try block 中捕获的未经检查的异常不是 Java 中的已检查异常吗?

标签 java exception checked-exceptions

有人告诉我,在Java中,unchecked exception可以在try block 中捕获,但是如果捕获到了,那不就叫checked exception吗?

最佳答案

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

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

已检查和未检查异常的定义可以在Section 11.2: Compile-Time Checking of Exceptions中找到。的 The Java Language Specification :

The unchecked exceptions classes are the class RuntimeException and its subclasses, and the class Error and its subclasses. All other exception classes are checked exception classes.

仅仅因为未检查的异常在 catch block 中被捕获并不能使它成为已检查的异常——它只是意味着未检查的异常被捕获,并在 catch block 。

可以捕获一个未经检查的异常,然后抛出一个新的检查异常,因此任何调用该方法的方法都可能发生未经检查的异常并强制调用一个方法它来处理某种异常。

例如,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;
}

在上面的例子中,一个NumberFormatExceptiontry-catch block 捕获,一个新的BadInputException(本应是已检查的异常)被抛出。

getIntegerFromInput 方法的任何调用者都将被迫捕获 BadInputException,并被迫处理错误的输入。如果未捕获和处理 NumberFormatException,则此方法的任何调用者都必须正确处理异常。

(另外,应该注意的是,吃掉一个异常并做一些没有真正意义的事情不被认为是一种好的做法——在可以执行有意义的异常处理的地方处理异常。)

来自 Java 教程:

关于java - 在 try block 中捕获的未经检查的异常不是 Java 中的已检查异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1051728/

相关文章:

java - 将 ObjectProperty<Node> 绑定(bind)到 Node 的子节点

Java图形图像解释?

java - 错误 :warning: Ignoring InnerClasses attribute for an anonymous inner class Error:(org. jsonschema2pojo.gradle。)

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

c# - HttpWebRequest 正确的异常处理

java - 如何在java中识别已检查和未检查的异常?

java - 如何从 Apache CXF REST 服务返回 XML 并将其转换为 json?

c++ - 如果派生类析构函数抛出异常,基类析构函数会发生什么

java - org.hibernate.exception.DataException 虽然被捕获

java - 服务层中的已检查异常与未检查异常