如果我有像
这样的代码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 statement
和for loop
内的代码无法访问。为什么java工作流逻辑没有检测到这种冗余?任何用例?
答案 0 :(得分:7)
如Java Language Specification所述,此功能仅供“条件编译”使用。
JLS中描述的一个例子是你可能有一个常量
static final boolean DEBUG = false;
以及使用此常量的代码
if (DEBUG) { x=3; }
我们的想法是提供一种方法,可以轻松地将DEBUG
从true
更改为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) {
...
}