假设我有一个名为 BugException 的类,它从 RuntimeException
扩展而来BugException有一个复制构造函数,它接受一个Throwable。
此代码编译和类型检查:
Throwable e = ...;
if (e instanceof BugException) {
throw new BugException(e);
}
为什么会这样:
Throwable e = ...;
if (e instanceof BugException) {
throw e;
}
不编译并给出错误消息:unhandle exception.java.lang.Throwable。
?为什么这种不必要的包装是必要的,以满足类型检查器的要求?
在编译时,不知道e
是什么样的异常。这可能是一个已检查的异常,在这种情况下,编译器将需要您将throw
包装在 try/catch 中或让方法抛出它。
但是,如果显式强制转换未选中的异常,则它将编译。
Throwable e = ...;
if (e instanceof BugException) {
throw (BugException) e;
}