我认为您提到的§14.18
throw语句中的措辞是JLS中的错误-
应该使用Java SE 7更新了该文本,而没有。
§11.2.2语句异常分析中描述了预期行为的JLS文本部分:
如果一条
throw语句的抛出表达式是catch子句C的最终异常参数或实际上是最终异常参数,则该语句可以引发异常类E iff:
- E是一个异常类,声明C
try的try语句的块可以抛出该异常类;和- E是与C的任何可捕获异常类兼容的分配;和
- E与
catch同一try语句中C左侧声明的子句的任何可捕获异常类的分配都不兼容。
第一个要点是相关的。因为
catch-clause参数
t实际上是最后的参数(意味着它从未分配,递增或递减;请参见§4.12.4
final变量),
throwt因此只能抛出该
try块可能抛出的内容。
但是正如您所说,第14.18节中的编译时检查对此没有任何余地。§11.2.2不能决定允许什么和不允许什么;相反,它应该是对可能引发的各种限制的后果的分析。(此分析确实反馈到规范的更规范的部分中-§14.18本身在第二个要点中使用了它-但§14.18不能仅说“如果它抛出一个异常而无法编译,这是一个编译时错误。按照§11.2.2“进行抛出,因为那是循环的。)
因此,我认为需要对§14.18进行调整以适应§11.2.2的意图。
好发现!



