【问题标题】:Why is an if/else if/else for a simple boolean not giving an "unreachable code" error为什么简单布尔值的 if/else if/else 没有给出“无法访问的代码”错误
【发布时间】:2016-03-18 14:06:40
【问题描述】:

为什么这段代码没有给出“无法访问的代码”错误?因为布尔值只能是真或假。

public static void main(String args[]) {
    boolean a = false;
    if (a == true) {

    } else if (a == false) {

    } else {
        int c = 0;
        c = c + 1;
    }
}

【问题讨论】:

  • 看本题后半部分:stackoverflow.com/questions/9276378/…
  • 检查 JLS 给出了答案(一如既往):“如果 if-then-else 语句可访问,则 else-statement 是可访问的。”。由于ifelse if 都可以访问,所以else 语句也是如此。
  • @Kidiskidvogingogin 不,您与 Boolean 混淆,这是对象。 boolean 是原始的。
  • 在多线程环境中,如果变量再次为真,当它刚刚到达 else 时,它​​可能首先为假

标签: java boolean unreachable-code


【解决方案1】:

来自JLS 14.21. Unreachable Statements

如果由于无法访问而无法执行语句,则这是编译时错误。

如果 if-then-else 语句可达,则 else 语句可达。

您的 if-then-else 语句是可访问的。因此,根据定义,编译器认为 else 语句是可访问的。

注意:有趣的是,下面的代码也可以编译

// This is ok
if (false) { /* do something */ }

while 不是这样

// This will not compile
while (false) { /* do something */ }

因为while 的可达性定义不同(强调我的):

如果while语句可达且条件表达式不是值为false的常量表达式,则包含的语句是可达的。

【讨论】:

  • 我不知道这是否是 Java 设计人员的想法,但使用 if (COMPILE TIME CONSTANT EXPRESSION) { ... } 构造可能很有用,其中编译时间常数表达式可能为真或假,具体取决于环境。
  • @zwol 这正是这种行为存在的原因。我还想记住,在 JVM 的第一个版本中,if(false) 是不可编译的,因为显然无法访问。另请注意,在为调试目的进行开发时,此行为可以方便地将 if(true){return;} 放在方法的中间。编译器完全知道后面的一切都是不可达的,但它仍然允许你编写它,因为它只是有用的。
猜你喜欢
  • 2016-02-25
  • 2019-04-06
  • 2015-04-19
  • 2012-10-20
  • 2021-10-22
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多