假设我有一个名为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中。 ?
为什么这种不必要的包装必须满足typechecker?
答案 0 :(得分:5)
在编译时,不知道e
是什么类型的异常。它可能是一个已检查的异常,在这种情况下,编译器需要您将throw
包装在try / catch中,或者让方法抛出它。
但是,如果您显式地转换未经检查的异常,那么它将进行编译。
Throwable e = ...;
if (e instanceof BugException) {
throw (BugException) e;
}