实例初始化程序异常处理



我不明白这些代码之间的区别。其中一个是编译的,另一个不是。

{
if (true) {
try {
throw new IOException();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

这是一个实例初始值设定项,我抛出一个已检查的异常,然后处理它,然后编译此代码。

但这个不是可编译的。

{
while (true) {
try {
throw new IOException();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

例外说明:Initializer must be able to complete normally

这是两者的图像实例初始化程序

剥离您的示例-因为try/catch/rethrow在这里并不重要:

{
if (true) {
throw new RuntimeException();
}
}

{
while (true) {
throw new RuntimeException();
}
}

这里重要的是Java是否认为语句可以正常完成,因为JLS 8.6说:

如果实例初始值设定项不能正常完成(§14.22(,这是一个编译时错误。

查阅不可访问语句的规则:

  • 如果if-then语句是可访问的,则它可以正常完成
  • while语句可以正常完成,如果以下至少一项为真:
    • while语句是可达的,并且条件表达式不是值为true的常量表达式(§15.29(
    • 有一个可到达的break语句退出while语句

(您也可以阅读同一节,了解为什么我说try/catch/rethrow无关紧要(。

请注意,if在正常完成时不具有与while相同的条件。

最新更新