Java 中的 Throwable 和 Exception

Throwable and Exception in Java

假设我有一个名为 BugException 的 class 扩展自 RuntimeException BugException 有一个复制构造函数,它接受一个 Throwable。

此代码编译和类型检查:

Throwable e = ...;
if (e instanceof BugException) {
   throw new BugException(e);
}

为什么会这样:

Throwable e = ...;
if (e instanceof BugException) {
   throw e;
}

不编译并给出错误信息:未处理的异常。 java.lang.Throwable。 ?

为什么需要这种不必要的包装来满足类型检查器的要求?

编译时,不知道e是什么异常。它可能是一个已检查的异常,在这种情况下,编译器将需要您将 throw 包装在 try/catch 中或让方法抛出它。

但是,如果您明确地强制转换未经检查的异常,那么它将编译。

Throwable e = ...;
if (e instanceof BugException) {
   throw (BugException) e;
}