我相信第11.2.2节的下一段回答了这个问题:
如果一条
throw语句的抛出表达式是catch子句C的最终异常参数或实际上是最终异常参数,则该语句可以引发异常类E iff:
- E是一个异常类,声明C
try的try语句的块可以抛出该异常类;和- …
因此,
throw e;“只能抛出”相应try块“可以抛出”的异常,后者由try-block中的实际语句定义。
显然,空的try-block不符合任何异常类的“可以抛出”的条件。您的第二个示例“可以抛出”
NullPointerException,并且由于catch块只能抛出try块“可以抛出”的异常,因此catch块也只能抛出未经检查的NullPointerException。
第三个示例的try块“可以抛出” java.lang.Exception本身,因此catch块“可以抛出”
java.lang.Exception,因此必须捕获或声明要抛出java.lang.Exception。



