为什么死码警告?

时间:2011-08-11 10:22:26

标签: java android

我有:

  if (Constants.IS_LIVE_MOD == false)
        account = Constants.OM_ACCOUNT;
  else
        account = "abc";

我在'else'上收到了死警告。为什么会这样,而wat就是它的解决方案。请帮忙。

12 个答案:

答案 0 :(得分:10)

我假设IS_LIVE_MOD常量是一个声明为false的最终变量,如果是,则变量总是为false且不能更改,因此将永远不会调用else语句。因此它是死代码。

E.g。

private static final boolean MY_VAR = false;

if(MY_VAR == false) {
    System.out.println("Always does this");
}
else {
    System.out.println("Dead code");
}

答案 1 :(得分:5)

如果IS_LIVE_MOD编译时常量且值为false,则编译器知道“else”路径永远不会采取,所以给你一个警告。 (Java语言规范保证它不会是错误,但警告你是合理的。)

答案 2 :(得分:5)

如果Constants.IS_LIVE_MOD是常量且其值为false,则编译器知道其他内容永远不会被执行。

你不能把它作为常数。

答案 3 :(得分:3)

您正在将两个常量(Constants.IS_LIVE_MODfalse)相互比较。由于它们是常量,因此可以在编译时确定结果。所以编译器可以告诉哪个部分永远不会被执行。

答案 4 :(得分:2)

条件if (Constants.IS_LIVE_MOD == false)始终评估为true。因此永远不会达到else

答案 5 :(得分:2)

这意味着     Constants.IS_LIVE_MOD 总是等于假;所以else子句永远不会执行;因此死码警告。

答案 6 :(得分:2)

警告的含义应该是明确的:代码不会被执行 - 已经死了 - 因为IS_LIVE_MOD是常量,但这是一个解决方案(解决方法):

if (!Constants.IS_LIVE_MOD)
    account = Constants.OM_ACCOUNT;
else
    account = "abc";

if (Constants.IS_LIVE_MOD)
    account = "abc";
else
    account = Constants.OM_ACCOUNT;

详情JLS 14.21:Unreachable Statements

如果删除比较,编译器会将其识别为“条件编译”,并且不会显示该警告。

理由(JLS):

  

为了允许if语句方便地用于“条件编译”目的

答案 7 :(得分:1)

如果Constants.IS_LIVE_MOD是常量(顾名思义)并且为false,则else子句永远不可能运行;这使它成为死代码。

答案 8 :(得分:1)

由于IS_LIVE_MOD是一个常量,编译器会发现它也是假的,并且else部分永远不会被使用(直到你改变你的常量,然后它将是另一种方式)。

不要担心。忽略或取消警告(方法@SuppressWarnings("all"),不幸的是,我认为必须是全部。

如果您有“真正的”死代码,则会出错。

答案 9 :(得分:1)

Constants.IS_LIVE_MOD如何宣布?如果它是final字段,则编译器很可能优化此表达式以使其始终为真。

答案 10 :(得分:1)

我会说最有效的写作方式是这样的:

account = Constants.IS_LIVE_MOD ? "abc"
                                : Constants.OM_ACCOUNT;

答案 11 :(得分:1)

我猜Constants.IS_LIVE_MOD是编译时常量,值设置为false。它变成了

if (false == false)
    account = Constants.OM_ACCOUNT;
else
    account = "abc";

您可以忽略该警告,因为Java似乎不支持条件编译Java conditional compilation: how to prevent code chunks from being compiled?