一个方法可以抛出java.lang.Exception而不声明它吗?

时间:2018-04-03 09:44:22

标签: java exception syntax

这个Java代码合法吗?显然它在不同的编译器上得到了不同的结果。

foo在未声明的情况下抛出Exception

如果try块中的代码没有声明抛出任何异常,那么我们知道到达Exception块的任何catch都是RuntimeException,所以实际上这是没关系

但这似乎需要深度静态代码分析,而对此方法的简单语法解读表明它是非法的。

您能引用我的语言规范的文章或部分吗?

public void foo() {// no  throws clause
    try {
        // Lines of code
    } catch (Exception e) {
        throw e;
    }  
}

1 个答案:

答案 0 :(得分:3)

请参阅§11.2 Compile-Time Checking of Exceptions

  

对于每个可能结果的已检查异常,方法或构造函数的throws子句必须提及该异常的类或该异常类的一个超类(第11.2.3节)。

更多部分详细介绍了表达式和语句的异常分析。

如果您尝试使用代码:

    try {
        // Lines of code
    } catch (Exception e) {
        throw e;
    }

它没有有效地抛出任何已检查的异常。它没有在Eclipse中给我任何编译器错误。

但是如果你尝试这样的话:

    try {
        new URL("https://www.stackoverflow.com");
    } catch (Exception e) {
        throw e;
    }

它可以抛出一个已检查的异常,并且必须在throws中提及它(或它的超类)。这给了我一个Eclipse中的“Unhandled exception type MalformedURLException”编译器错误。

相关问题