繁体   English   中英

为什么是死代码警告?

[英]Why Dead Code Warning?

我有:

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

我在“其他”上收到死代码警告。 为什么会这样,而 wat 是它的解决方案。 请帮忙。

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

例如

private static final boolean MY_VAR = false;

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

如果IS_LIVE_MOD是值为false的编译时常量,则编译器知道永远不会采用“else”路径,因此会发出警告。 (Java 语言规范保证不会出错,但警告你是合理的。)

如果Constants.IS_LIVE_MOD是一个常量并且它的值为 false,那么编译器就知道 else 永远不会被执行。

你不能把它当作一个常数。

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

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

这意味着 Constants.IS_LIVE_MOD 始终等于 false; 所以 else 子句永远不会被执行; 因此死代码警告。

警告的含义应该很清楚:代码不会被执行 - 已经死了 - 因为 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: 无法访问的语句

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

理由(JLS):

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

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

由于 IS_LIVE_MOD 是一个常量,编译器发现它也将是错误的,并且永远不会使用 else 部分(除非您更改常量,否则它会反过来)。

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

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

Constants.IS_LIVE_MOD是如何声明的? 如果它是一个final字段,那么编译器很可能会将此表达式优化为始终为真。

我想说写这个最有效的方法是这样的:

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

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

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

您可以忽略警告,因为 Java 似乎不支持条件编译Java 条件编译:如何防止编译代码块?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM