2014-10-30 5 views
5

У меня проблема, я получаю предупреждение «Мертвого кода» в Eclipse, и я действительно не знаю, почему. Код из моего проекта Connect Four, точнее, из класса, который проверяет, выиграл ли кто-то. Этот метод проверяет все возможности горизонтального выигрыша для красного. Код выглядит следующим образом:Откуда берется мертвый код?

/** 
* Method to check the horizontal winning possibilities for red 
* @return true if red won or false if not 
*/ 
public boolean checkHorRed(){ 
    for(int line = 0; line < 6; line++) { 
     for(int column = 0; column < 4; column++) { //column++ is underlined and causes the "dead Code" warning 
      if(gw.buttons[line][column].getIcon().equals(gw.red)); 
       if(gw.buttons[line][column+1].getIcon().equals(gw.red)); 
        if(gw.buttons[line][column+2].getIcon().equals(gw.red)); 
         if(gw.buttons[line][column+3].getIcon().equals(gw.red)); 
          return true; 
     } 
    } 
    return false; 
}  

Игра даже вызвана тем, что ее сразу выиграли из-за этого метода. Что странно в том, что все остальные методы в классе, которые выглядят почти одинаково, не создают никаких проблем. Вот метод, который проверяет возможности вертикального выигрыша для желтого, для сравнения:

/** 
* Method to check the vertical winning possibilities for yellow 
* @return true or false 
*/ 
public boolean checkVertYel(){ 
    for(int line = 3; line < 6; line++) { 
     for(int column = 0; column < 7; column++) { 
      if(gw.buttons[line][column].getIcon().equals(gw.yellow)) 
       if(gw.buttons[line-1][column].getIcon().equals(gw.yellow)) 
        if(gw.buttons[line-2][column].getIcon().equals(gw.yellow)) 
         if(gw.buttons[line-3][column].getIcon().equals(gw.yellow)) 
          return true; 
     } 
    } 
    return false; 
}  

Это не вызывает никаких проблем. Может ли кто-нибудь сказать мне, откуда появляется предупреждение? Если вам нужна дополнительная информация, сообщите мне.

+1

Как стоит все эти 'if's ничего не делать, потому что у вас есть', 'после каждого из них. Это означает, что ваш внутренний цикл 'for' ** всегда ** возвращает true на первой итерации, что означает, что' column ++ 'никогда не будет достигнуто. Вот почему вы всегда должны использовать '{}', даже с помощью простых циклов/ifs. – JonK

+1

Вы должны подумать об использовании оператора '&&' в своих 'if'statements. – jhamon

ответ

1

Мертвый код в вашей функции: the increment statement вашего внутреннего цикла (column++). Оператор return true всегда будет выполняться (если цикл выполняется), поэтому инкремент цикла никогда не произойдет.

Это ваш код, но отформатирован:

// ... 

for(int column = 0; column < 4; column++) { 
    //column++ is underlined and causes the "dead Code" warning 
    if(gw.buttons[line][column].getIcon().equals(gw.red)); 

    if(gw.buttons[line][column+1].getIcon().equals(gw.red)); 

    if(gw.buttons[line][column+2].getIcon().equals(gw.red)); 

    if(gw.buttons[line][column+3].getIcon().equals(gw.red)); 

    return true; 
} 

// ... 

Вы можете легко определить ошибку: return true всегда будет выполняться, поэтому приращение утверждение внутреннего цикла не будет выполнено.

Вот как код должен выглядеть следующим образом:

public boolean checkHorRed() { 
    for(int line = 0; line < 6; line++) { 
     for(int column = 0; column < 4; column++) { 
      //column++ is underlined and causes the "dead Code" warning 
      if(gw.buttons[line][column].getIcon().equals(gw.red) 
        && gw.buttons[line][column+1].getIcon().equals(gw.red) 
        && gw.buttons[line][column+2].getIcon().equals(gw.red) 
        && gw.buttons[line][column+3].getIcon().equals(gw.red) { 
       return true; 
      } 
     } 
    } 

    return false; 
} 
+0

Хорошо, ваш ответ еще более подробно, поэтому я соглашусь с этим.Спасибо за все ответы на мою действительно глупую проблему! – Lunaetic

0

В вышеуказанном методе у вас есть; после каждого оператора if, где, когда ваш второй метод является правильным, что является правильным способом.

if(gw.buttons[line][column].getIcon().equals(gw.red)); <-- 

Это завершает работу там, где есть. Ваша строка кода, эквивалентная

if(condition) 
    { 

    } 

Это означает, что код после условий if мертв.

+1

Я не знаю, почему, черт возьми, я это сделал, и как я этого не видел ... Спасибо вам большое! – Lunaetic

+1

@ifLoop, конечно! Downvote совершенно ненужно –

+0

@ifLoop Хотя я не нахожу термин «мертвый», ответ сам объясняет. Отредактировано немного, чтобы уточнить. –

0

Это ваш код после переформатирования:

public boolean checkHorRed() { 
    for (int line = 0; line < 6; line++) { 
     for (int column = 0; column < 4; column++) { //column++ is underlined and causes the "dead Code" warning 
      if (gw.buttons[line][column].getIcon().equals(gw.red)) { 
       ; 
      } 
      if (gw.buttons[line][column + 1].getIcon().equals(gw.red)) { 
       ; 
      } 
      if (gw.buttons[line][column + 2].getIcon().equals(gw.red)) { 
       ; 
      } 
      if (gw.buttons[line][column + 3].getIcon().equals(gw.red)) { 
       ; 
      } 
      return true; //this will always happen 
     } 
    } 
    return false; 
} 

И это другое:

public boolean checkVertYel() { 
    for (int line = 3; line < 6; line++) { 
     for (int column = 0; column < 7; column++) { 
      if (gw.buttons[line][column].getIcon().equals(gw.yellow)) { 
       if (gw.buttons[line - 1][column].getIcon().equals(gw.yellow)) { 
        if (gw.buttons[line - 2][column].getIcon().equals(gw.yellow)) { 
         if (gw.buttons[line - 3][column].getIcon().equals(gw.yellow)) { 
          return true; 
         } 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 

В принципе, вы должны действительно не закончить свои if заявления с запятой.