为什么Java仅在while循环的情况下识别无法访问的代码?

时间:2014-06-01 07:01:52

标签: java loops if-statement unreachable-code

如果我有像

这样的代码
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工作流逻辑没有检测到这种冗余?任何用例?

3 个答案:

答案 0 :(得分:7)

Java Language Specification所述,此功能仅供“条件编译”使用。

JLS中描述的一个例子是你可能有一个常量

static final boolean DEBUG = false;

以及使用此常量的代码

if (DEBUG) { x=3; }

我们的想法是提供一种方法,可以轻松地将DEBUGtrue更改为false,而无需对代码进行任何其他更改,如果上述代码提供了编译错误。

答案 1 :(得分:2)

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

class A {
    final boolean debug = false;

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

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

EDIT 正如克里斯蒂安在他的评论中指出的那样,可以找到链接到规范的答案here

答案 2 :(得分:2)

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

关于if,这是一个有意识的选择,以便能够在编译时从字节代码中删除调试代码:

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

...

if (DEBUG) {
    ...
}