为什么这个“如果”是“死代码”?

时间:2013-02-14 08:06:31

标签: java

我有以下代码:

/** 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方法的最开始初始化值。

感谢。

7 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

@oalsing你是对的但是在BRICK_WIDTH = 1的情况下,eclipse会说else block是死代码并且比较相同的表达式,因为值是硬编码的。

答案 4 :(得分:0)

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

因此,编写一些在语法上正确但永远不会被使用的代码行是不合逻辑的。这就是为什么作为一种惯例,它被称为DEAD CODE。

您可能会遇到类似

的情况
while(false){}
if(false){}

在你的情况下

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

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

答案 5 :(得分:-1)

{   
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)));
}

答案 6 :(得分:-1)

如果,(我假设BRICK_WIDTH是一个积极整数)是BRICK_WIDTH = 1时,你唯一一次输入;

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

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