您是正确的,任何扩展 Exception 的类都将是一个检查异常,但是您的下一条语句是错误的:
如果我通过扩展 Throwable、RuntimeException 或 Error 创建了一个类,那么它将是 unchecked Exception
如果您扩展 RuntimeException 或 Error,您的类将是未经检查的异常。
另一方面,Throwable 是由 Exception 扩展的,并且像 Exception 一样是一个已检查的异常。
下面的代码实际演示了这些。有关更多信息,Barry 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
:应该由任何需要抛出的类扩展的顶级类(如异常和错误)。Throwable
s 被检查。请参阅: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)