【问题标题】:Why is this "if" a "dead code"?为什么这个“如果”是“死代码”?
【发布时间】:2013-02-14 08:06:30
【问题描述】:

我有以下代码:

/** Width of each brick in pixels */
    private static final int BRICK_WIDTH = 11; 

/** Width of each brick in pixels */
    private static final int BRICK_HEIGHT = 12;

/** Number of bricks in the base of the pyramid */
    private static final int BRICKS_IN_BASE = 14;

public void run () {

    int LowerLeftSide;
    if (BRICK_WIDTH / 2 == 0)
    {
         LowerLeftSide = ((getWidth()/2) - (BRICK_WIDTH*(BRICKS_IN_BASE/2)));
    }else 
         LowerLeftSide = ((getWidth()/2) - (BRICK_WIDTH*(BRICKS_IN_BASE/2-1)));

eclipse 将整个if 标记为死代码。我在 run 方法的最开始初始化值。

谢谢。

【问题讨论】:

  • 请包含BRICK_WIDTH的声明和初始化
  • 我认为,您应该提供更广泛的背景。更多代码。
  • 第一个花括号是错字吗?因为如果不是,我敢打赌这就是原因。
  • 你应该把BRICK_WIDTH / 2放在括号里。或者完全松开/ 2,你不需要它。
  • 寻求解决方案并发布不清楚和不完整的问题 - 编辑您的问题

标签: java


【解决方案1】:

看起来BRICK_WIDTH 是一个常量,因此BRICK_WIDTH/2 在编译时是已知的,并且eclipse 知道将采用哪条路径,所以另一个是死代码。

【讨论】:

  • 是的,确实如此。有没有办法规避,因为程序必须独立于 BRICK_WIDTH 的具体值。
  • 规避什么? BRICK_WIDTH 在执行期间永远不会改变。如果您希望在运行时评估 BRICK_WIDTH,则不得将其声明为 static final
  • @MindaugasBernatavičius 如果您只是想抑制警告,请尝试将@SuppressWarnings("deadCode") 放在前面? (由this question建议。)
  • 明白。 “如果”条件不会解决我遇到的问题。我会尝试另一种方式。谢谢
【解决方案2】:

当您为BRICK_WIDTH 使用大写字母时,我假设您将其定义为常量(final)?那么,除非BRICK_WIDTH == 0(或 1,如果是 int,则可能为 -1),BRICK_WIDTH / 2 永远不会为 0。因此永远不会到达 if 下的代码。

【讨论】:

    【解决方案3】:

    编辑:我的回答完全错误。

    BRICK_WIDTH 的值是多少?如果它为零,那么那个井总是执行,它永远不会进入else

    【讨论】:

    • 这不是真的。如果 [BRICK_WIDTH] 为零,则将进入 [if] 部分,而永远不会进入 else 部分。所以否则将是死代码。
    • BRICK_WIDTH 不必是0 才能生成BRICK_WIDTH / 2 == 01/2 也被评估为 0
    【解决方案4】:

    @oalsing 你是对的,但如果 BRICK_WIDTH = 1,eclipse 会说 else 块是死代码并比较相同的表达式,因为值是硬编码的。

    【讨论】:

      【解决方案5】:

      当您为循环提供的条件永远不会为真时,您的 IDE 会调用代码死代码,因此程序永远不会使用条件块中的代码。

      因此,编写一些语法正确但永远不会使用的代码行是不合逻辑的。这就是为什么按照惯例将其称为死代码。

      你可能会遇到这样的情况

      while(false){}
      if(false){}
      

      你的情况

      private static final int BRICK_WIDTH = 11;
      if (BRICK_WIDTH / 2 == 0){}
      

      因为你的变量是最终定义的,所以编译器知道它永远不会改变它的值,因此条件永远不会为真。所以按照惯例,它被称为死代码。

      【讨论】:

        【解决方案6】:
        {   
        int LowerLeftSide;
        if ((BRICK_WIDTH / 2) == 0) {
             LowerLeftSide = ((getWidth()/2) - (BRICK_WIDTH*(BRICKS_IN_BASE/2)));
        } else {
             LowerLeftSide = ((getWidth()/2) - (BRICK_WIDTH*(BRICKS_IN_BASE/2-1)));
        }
        

        【讨论】:

        • 抱歉,不知道你想在这里得到什么。请解释你的答案。
        【解决方案7】:

        如果(我假设 BRICK_WIDTH 是正整数)您将输入的唯一时间是 BRICK_WIDTH = 1;

        因为值 / 2 从不为 0,但在 java 中 1/2 = 0,因为它是处理整数的方式。

        编辑:我不知道为什么它说它是死代码,但这是一个普遍的想法。

        【讨论】:

        • 1/2 == 0 不是 Java 特定的,而且......这并不能回答问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 2021-06-20
        • 2012-08-27
        相关资源
        最近更新 更多