4

If I have code like

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

compiler will complaint that x=3 is unreachable code but if I have code like

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

then it compiles correctly though the code inside if statement and for loop is unreachable. Why is this redundancy not detected by java workflow logic ? Any usecase?

4

3 回答 3

7

Java Language Specification中所述,此功能保留用于“条件编译”。

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

static final boolean DEBUG = false;

以及使用这个常量的代码

if (DEBUG) { x=3; }

这个想法是提供一种在不对代码进行任何其他更改的情况下轻松更改的可能性,如果DEBUG上面的代码出现编译错误,这是不可能的。truefalse

于 2014-06-01T07:09:38.123 回答
2

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

class A {
    final boolean debug = false;

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

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

编辑正如克里斯蒂安在评论中指出的那样,可以在此处找到链接到规范的答案。

于 2014-06-01T07:09:01.540 回答
2

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

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

private static final boolean DEBUG = false; // or true

...

if (DEBUG) {
    ...
}
于 2014-06-01T07:09:43.837 回答