我不明白这些密码之间的区别。其中一个是编译的,另一个不是。
{
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
这是两个实例初始化器的图像
发布于 2022-08-11 13:34:00
去掉示例--因为在这里尝试/捕捉/重抛并不重要:
{
if (true) {
throw new RuntimeException();
}
}vs
{
while (true) {
throw new RuntimeException();
}
}这里重要的是Java是否认为语句可以正常完成,因为JLS 8.6说:
如果实例初始化程序不能正常完成,则为编译时错误(§14.22).
if-then语句可以在可到达的情况下完成。while语句可以完成以下至少一个为真的情况:(您也可以阅读这一节,以了解为什么我说try/catch/ read无关紧要)。
注意,if在正常完成时不具有与while相同的条件。
https://stackoverflow.com/questions/73321158
复制相似问题