【问题标题】:Why Dead Code Warning?为什么是死代码警告?
【发布时间】:2011-10-24 20:25:35
【问题描述】:

我有:

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

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

【问题讨论】:

  • 我们需要查看更多代码。 Constants.OM_ACCOUNT 的值是多少?
  • Constants.IS_LIVE_MOD 可以是真的吗?它是一个常数的事实表明不是,在这种情况下,'else' 将永远不会被执行。

标签: java android


【解决方案1】:

警告的意思应该很清楚:代码将不会被执行 - 已死 - 因为 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 语句方便地用于“条件编译”目的

【讨论】:

    【解决方案2】:

    条件if (Constants.IS_LIVE_MOD == false) 始终计算为true。因此永远无法到达else。

    【讨论】:

      【解决方案3】:

      我假设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");
      }
      

      【讨论】:

      • 不,不要删除final。只是忽略警告。在 Java 中没有比 #ifdef 更好的方法了...
      • 常数会改变吗?如果没有,那么你真的不需要 if 语句。如果你只是想让警告消失,你可以使用 suppresswarnings 注释告诉编译器忽略它:knol.google.com/k/suppresswarnings-annotation-in-java
      • 只是去掉比较,看下面我的回答
      【解决方案4】:

      我猜 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?

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 不想显得粗鲁,这对解决手头的问题并没有多大帮助。此外,我总是对使用三元运算符有点警惕,因为我个人发现它使代码的可读性降低,并且几乎没有或没有性能提升。请参阅此处进行一些(相当过时的)讨论:coderanch.com/t/391402/java/java/Ternary-operator-if-condn
          • 是的,你是对的。它没有回答这个问题。我今天才加入,所以我把它归结为菜鸟。
          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

                    这意味着 常量.IS_LIVE_MOD 总是等于假;所以 else 子句永远不会被执行;因此出现了死代码警告。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-08-10
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多