Просматривая массив объектов - PullRequest
1 голос
/ 17 октября 2010

Я пытаюсь написать метод, который просматривает массив объектов определенного цвета, который также является объектом.

public Ghost findFirst(Color c){
        for (int i=0;i<ghosts.length;i++) {
            if (ghosts[i].getColor()==c)
            return ghosts[i];
        else
            return null;
            }  
    }

Так что, если цвет определенного призрака соответствует цвету с, верните этого призрака. Тем не менее, я получаю предупреждение о мертвом коде для i ++. Что не так с моим кодом? О, также я получаю ошибку метода, говорящую, что эта функция должна вернуть призрак. Я думал, что я?

Ответы [ 6 ]

7 голосов
/ 17 октября 2010

Потому что вы возвращаетесь из цикла на первой итерации! Так что «я» никогда не увеличивается. Либо полностью удалите блок else, либо измените значение «return null» на «continue».

В качестве отдельной точки, == проверяет ссылочное равенство, а не равенство объектов. Вероятно, вы должны использовать вместо «.equals»

3 голосов
/ 17 октября 2010

фиксированный код:

public Ghost findFirst(Color c){
        for (int i=0;i<ghosts.length;i++) {
            if (ghosts[i].getColor().equals(c))
               return ghosts[i];
        }
        return null;
    }

имейте в виду, что return завершает функцию (включая цикл, очевидно).Поэтому, если вы нашли правильного цветового призрака - вы возвращаете его (тем самым заканчивая поиск и никогда не достигая строки return null;).Если ваш цикл for ничего не нашел - вы попадаете на последнюю строку и возвращаете ноль.

2 голосов
/ 17 октября 2010
public Ghost findFirst(Color c){
    for (int i=0; i < ghosts.length; i++) {
        if (ghosts[i].getColor().equals(c))
            return ghosts[i];
    }  
    return null;
}
2 голосов
/ 17 октября 2010

Это из-за

else 
  return null;

!

Из-за этого оператора возврата ваш цикл будет выполнен только один раз.

1 голос
/ 17 октября 2010

Если я «разверну» ваш цикл, код выполняет что-то вроде:

public Ghost findFirst(Color c){
    if (ghosts[0].getColor()==c)
       return ghosts[0];
    else
       return null;  

    if (ghosts[1].getColor()==c)
       return ghosts[1];
    else
       return null; 

    if (ghosts[2].getColor()==c)
       return ghosts[2];
    else
       return null; 
    //etc...
}

Из этого должно быть ясно, что он никогда не достигнет второго if, он возвращается (прерывается изфункция) на первом if, true или false.

0 голосов
/ 17 октября 2010

Ваш кратный return может быть проблемой.Иногда бывает проще иметь один return.

public Ghost findFirst(Color c) {
    Color color = null;
    for (int i=0;i<ghosts.length;i++) {
        if (ghosts[i].getColor().equals(c))
        color = ghosts[i];
    }
    return color;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...