Java方法并不总是需要声明抛出已检查的异常

时间:2015-01-23 01:32:07

标签: java exception-handling unhandled-exception

我今天发现了一个我认为应该是"未处理的异常类型"编译错误:

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}}实际上是对外部库的调用。在编译时,您使用的版本不会抛出任何已检查的异常,但是在运行时,您将其切换为 的版本 - 现在您已经取消选中了代码中的已检查异常!)

0 个答案:

没有答案