我今天发现了一个我认为应该是"未处理的异常类型"编译错误:
public void foo() {
try {
// do something fun
} catch (Throwable e) {
throw e; // only a compile error sometimes
}
}
注意foo
如何在方法声明中不包含throws Throwable
,即使它可能会抛出一个。如果try/catch
中的代码没有抛出任何已检查的异常,那么您不需要在方法签名中声明已检查的异常
如果我们用一些实际的检查异常抛出代码(例如// do something fun
)替换"".getBytes("")
,编译器会识别出必须抛出异常,并且可以在throws UnsupportedEncodingException
中包含throws Throwable
用于修复编译错误的方法声明(请注意,即使catch块将其定义为Throwable e
do something
我早在Java 6上就尝试过它,它也在那里工作。 Java编译器什么时候变得聪明?是否有任何安全检查以确保不会被轻易利用来做有趣的事情?我对什么都没有兴奋吗?
("有趣的事情"例如{{1}}实际上是对外部库的调用。在编译时,您使用的版本不会抛出任何已检查的异常,但是在运行时,您将其切换为 的版本 - 现在您已经取消选中了代码中的已检查异常!)