首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例初始化程序异常处理

问实例初始化程序异常处理
EN

Stack Overflow用户
提问于 2022-08-11 13:04:44
回答 1查看 62关注 0票数 -2

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

代码语言:javascript
复制
{
    if (true) {
        try {
            throw new IOException();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

这是一个实例初始化程序,我抛出一个检查过的异常,然后处理它,然后编译这段代码。

但这个不是编译的。

代码语言:javascript
复制
{
    while (true) {
        try {
            throw new IOException();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

例外说:Initializer must be able to complete normally

这是两个实例初始化器的图像

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-11 13:34:00

去掉示例--因为在这里尝试/捕捉/重抛并不重要:

代码语言:javascript
复制
{
    if (true) {
        throw new RuntimeException();
    }
}

vs

代码语言:javascript
复制
{
    while (true) {
        throw new RuntimeException();
    }
}

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

如果实例初始化程序不能正常完成,则为编译时错误(§14.22).

咨询关于不可达语句的规则

  • 正常情况下,if-then语句可以在可到达的情况下完成。
  • ..。
  • 通常情况下,while语句可以完成以下至少一个为真的情况:
    • while语句是可访问的,条件表达式不是值为true的常量表达式(§15.29)。
    • 有一个可达中断语句退出while语句。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73321158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档