2013-02-14 2 views
-1

У меня есть следующий код:Почему это «если» «мертвый код»?

/** 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))); 

затмение отмечает весь if, как мертвый код. Я инициализирую значение в самом начале метода run.

Спасибо.

+11

Просьба включить объявление и инициализацию для 'BRICK_WIDTH' – Philipp

+1

Я думаю, вы должны дать более широкий контекст. Больше кода. –

+3

Это первая фигурная фигурная скобка? Потому что, если нет, я держу пари, вот почему. –

ответ

16

Похоже, что BRICK_WIDTH является константой, поэтому BRICK_WIDTH/2 известен во время компиляции, и затмение знает, какой путь будет взят, а другой - мертвым кодом.

+0

+1 'if condition' никогда не встречался. –

+0

Да, действительно. Есть ли способ обойти, потому что программа должна быть независимой от конкретного значения BRICK_WIDTH. –

+0

Circumvent what? «BRICK_WIDTH» никогда не будет меняться во время выполнения. Если вы хотите, чтобы «BRICK_WIDTH» оценивался во время выполнения, вы не должны объявлять его «статическим окончанием». – Bombe

-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))); 
} 
+1

Извините, не уверен, что вы пытаетесь получить здесь. Пожалуйста, объясните свой ответ. – BoltClock

+0

Возможно, ошибка sintax ... – John

0

РЕДАКТИРОВАТЬ: Полностью ошибочно в моем ответе.

Какая ценность BRICK_WIDTH? Если он равен нулю, то это всегда выполняется, и он никогда не войдет в else.

+0

это неправда. если [BRICK_WIDTH] равно нулю, можно было бы войти в часть [if] и никогда в другой части. так что иначе будет мертвый код. –

+0

'BRICK_WIDTH' не должно быть' 0', чтобы сделать 'BRICK_WIDTH/2 == 0'! '1/2' оценивается как' 0'. – Maroun

4

Как вы используете капиталы для BRICK_WIDTH Предполагаете, вы определили его как константу (final)? Тогда, если BRICK_WIDTH == 0 (или 1 и, возможно, -1, если это int), BRICK_WIDTH/2 никогда не будет 0. Следовательно, код под if никогда не будет достигнут.

-1

Единственный раз, когда вы войдете, если (предположим, что BRICK_WIDTH является целым числом позитива), когда BRICK_WIDTH = 1;

Поскольку значение/2 никогда не равно 0, но в java 1/2 = 0, из-за его способа обработки целых чисел.

EDIT: Я не знаю, почему он говорит, что это мертвый код, но это общая мысль.

+1

'1/2 == 0' не является специфичным для Java, и ... это не отвечает на вопрос. –

0

@ solals Вы правы, но в случае BRICK_WIDTH = 1, eclipse скажет, что блок else является мертвым кодом и сравнивает идентичное выражение, потому что значения жестко закодированы.

0

IDE вызывает код мертвого кода, когда условие, которое вы предоставили для цикла, никогда не будет истинным, поэтому программа никогда не сможет использовать код в блоке условий.

Таким образом, нелогично написать некоторую строку кода, которая является синтаксически правильной, но никогда не будет использоваться. Вот почему в качестве конвенции ее называют МЕРТВЫМ КОДОМ.

вы можете столкнуться с ситуациями, как

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

в вашем случае

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

поскольку переменная определена окончательная, таким образом, компилятор знает, что он никогда не изменит свое значение, таким образом, условие никогда не будет правда . Поэтому, следуя конвенции, ее называют мертвым кодом.

Смежные вопросы