-1

我和一位前辈讨论过 Java 中的 Exception 概念
如果我通过扩展 Exception 类创建一个类,那么它将被检查异常
如果我通过扩展 Throwable、RuntimeException 或 Error 创建一个类,那么它将是未检查异常

上述说法正确吗?
注意:我通过此链接何时选择已检查和未检查的异常

编辑:
在回答@Daemon 时,他说
“另一方面,Throwable 由异常扩展,因此是一个检查异常。”
我有一个问题: Throwable 也被 Error 扩展了,那为什么不是 Unchecked 呢?

4

5 回答 5

2

您是正确的,任何扩展 Exception 的类都将是一个检查异常,但是您的下一条语句是错误的:

如果我通过扩展 Throwable、RuntimeException 或 Error 创建了一个类,那么它将是 unchecked Exception

如果您扩展 RuntimeException 或 Error,您的类将是未经检查的异常。

另一方面,Throwable 是由 Exception 扩展的,并且像 Exception 一样是一个已检查的异常。

下面的代码实际演示了这些。有关更多信息,B​​arry Ruzek 的“Effective Java Exceptions”对这个主题进行了一些非常有趣的阅读。

public class JavaExceptions {

    public static void throwException() throws Exception {
        throw new Exception("This is a Checked Exception.");
    }

    public static void throwRuntimeException() throws RuntimeException {
        throw new RuntimeException("This is a Runtime Exception.");
    }

    public static void throwError() throws Error {
        throw new Error("This is an Error.");
    }

    public static void throwThrowable() throws Throwable {
        throw new Throwable("This is a Throwable.");
    }

    public static void main (String... args) {

        //Exception extends Throwable, thus both are checked Exceptions.
        try {
            throwThrowable();
            throwException();
        } catch (Throwable e) {
            //Handle exception (or throwable in this case)...
            e.printStackTrace();
        }

        //RuntimeException and Error are both unchecked exceptions.
        throwRuntimeException();
        throwError();
    }
}

编辑 1:关于Error及其使用,这取自Oracle 的文档

Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应该尝试捕获它。方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 Error 子类,因为这些错误是不应该发生的异常情况。也就是说,为了对异常进行编译时检查,Error 及其子类被视为未经检查的异常。

编辑2:我们在这里处理的类可以描述如下:

Throwable extends Object:应该由任何需要抛出的类扩展的顶级类(如异常和错误)。Throwables 被检查。请参阅:Throwable(Java 平台 SE 7)

Error extends Throwable:它的一个子类Throwable表示一个合理的应用程序不应该试图捕捉的严重问题。覆盖Throwable功能成为unchecked。请参阅:错误(Java 平台 SE 7)

Exception extends Throwable:它的另一个子类Throwable表示合理的应用程序可能想要捕获的条件。就像Throwable,被检查了。请参阅:异常(Java 平台 SE 7)

RuntimeException extends Exception:在Java虚拟机正常运行期间可以抛出的那些异常的超类。覆盖Exception功能成为unchecked。请参阅:RuntimeException(Java 平台 SE 7)

于 2013-08-05T05:45:16.130 回答
2

任何延伸Exception但不延伸的东西RuntimeExceptionError并且Throwable不应被 Java 程序使用,因为Error它旨在传达严重的、不可恢复的问题,例如内存完全耗尽、硬件问题等。

从技术上讲,只有扩展的类Exception才是例外;Errors 和 other Throwables 也不例外,不希望被常规程序捕获。

于 2013-08-05T05:30:37.427 回答
1

From the oracle documentation: "For the purposes of compile-time checking of exceptions, Throwable and any subclass of Throwable that is not also a subclass of either RuntimeException or Error are regarded as checked exceptions. " So, your first statement is correct, the second is not. You can read more in the SCJP Sun Certified Programmer for Java 6 pg. 356-380.

于 2013-08-05T05:38:30.297 回答
0

如果我通过扩展 Exception 类来创建一个类,那么它将被检查异常

这是对的。

如果我通过扩展 Throwable、RuntimeException 或 Error 创建了一个类,那么它将是 unchecked Exception

这是不正确的。类RuntimeException及其子类,类Error及其子类都是未经检查的异常类。因为编译器不会强制它们在 throws 子句中声明。属于层次结构的所有其他异常类Throwable都是检查异常。

于 2013-08-05T05:32:39.157 回答
0

异常类和错误类都扩展了 Throwable 类。RuntimeException 类扩展了 Exception 类。检查的异常应该是在编译时使用 try catch 或 throws 处理的。不需要处理 RunTimeExceptions。错误不应该被处理,而是让它们发生,因为它们是严重的事情。

于 2013-08-05T05:34:44.447 回答