1

假设我有一个名为 BugException 的类,它从RuntimeException 并且 BugException 有一个接受 Throwable 的复制构造函数。

此代码编译和类型检查:

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

为什么会这样:

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

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

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

4

1 回答 1

5

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

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

Throwable e = ...;
if (e instanceof BugException) {
   throw (BugException) e;
}
于 2016-05-30T02:44:39.167 回答