【问题标题】:Why Java identifies unreachable code only in case of while loop? [duplicate]为什么Java仅在while循环的情况下识别无法访问的代码? [复制]
【发布时间】:2014-07-21 13:34:59
【问题描述】:

如果我有类似的代码

public static void main(String args[]){
    int x = 0;
    while (false) { x=3; }  //will not compile  
}

编译器会抱怨x=3 是无法访问的代码,但如果我有类似的代码

public static void main(String args[]){
    int x = 0;
    if (false) { x=3; }
    for( int i = 0; i< 0; i++) x = 3;   
}

尽管if statementfor loop 中的代码无法访问,但它会正确编译。为什么 java 工作流逻辑没有检测到这种冗余?有什么用例吗?

【问题讨论】:

  • 很奇怪,if (false) { x=3; } 部分看起来好像是从JSL 中复制出来的(一直滚动到底部)。
  • 不。我在 OCJP 认证演示考试中遇到了这个问题。不过感谢 JSL 链接。
  • 好吧,我猜想编写演示的其中一个人很懒... :)

标签: java loops if-statement unreachable-code


【解决方案1】:

带有 if 条件的用例是调试。 AFAIK 规范明确允许 if-statements(不是 for 循环)允许这样的代码:

class A {
    final boolean debug = false;

    void foo() {
        if (debug) {
            System.out.println("bar!");
        }
        ...
    }
}

您可以稍后(或在运行时通过调试器)更改 debug 的值以获取输出。

编辑 正如 Christian 在评论中指出的那样,可以在 here 找到链接到规范的答案。

【讨论】:

    【解决方案2】:

    Java Language Specification 中所述,此功能是为“条件编译”保留的。

    JLS 中描述的一个示例是,您可能有一个常量

    static final boolean DEBUG = false;
    

    以及使用这个常量的代码

    if (DEBUG) { x=3; }
    

    这个想法是提供一种可能性,可以轻松地将 DEBUGtrue 更改为 false,而无需对代码进行任何其他更改,如果上述代码出现编译错误,这是不可能的。

    【讨论】:

    • +1 用于 JLS 参考。
    • 谢谢,这是有道理的。
    【解决方案3】:

    关于 for 循环,我认为它不像在 while 循环中使用 false 常量那么容易检测。

    关于if,这是一个经过深思熟虑的选择授权它以便能够在编译时从字节码中删除调试代码:

    private static final boolean DEBUG = false; // or true
    
    ...
    
    if (DEBUG) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多