2016-09-25 3 views
1

Мне нужно определить, какой хищник в моем массиве PredatorList получил наибольший урон. По какой-то причине, когда я пытаюсь вернуть этого хищника, eclipse говорит - mostDamaged не может быть разрешен переменной.Возвращение определенного объекта массива в определение метода

Почему это так?

public Predator mostDamagedPredator() { 
    // test if PredatorList contains predators 
    if (PredatorList.length > 0){ 
     float difference = 0; 
     for (int i = 0; i < PredatorList.length; i++) { 
      if (PredatorList[i].getMaxHitPoints() - PredatorList[i].getHitPoints() > difference){ 
       Predator mostDamaged = PredatorList[i]; 
      } 
     } 
     return mostDamaged; // ERROR - mostDamaged cannot be resolved to a variable 
    } 
    // return null if there are no predators in PredatorList 
    return null; 
} 
+0

Поскольку не существует переменная с именем 'mostDamaged'. –

+0

Кстати, все это можно записать как 'Arrays.stream (PredatorList) .max (Comparator.comparing (p -> p.getMaxHitPoints() - p.getHitPoints())). Кроме того, в Java мы используем 'camelCase' для переменных,' PascalCase' является резервом для классов - пожалуйста ** всегда ** придерживайтесь этого соглашения. –

ответ

1

Вы объявили mostDamaged внутри блока с if заявление, так что это не входит в сферу вне этого блока.

Переместить его снаружи:

public Predator mostDamagedPredator() { 
    if (PredatorList.length > 0){ 
     float difference = 0; 
     Predator mostDamaged = null; 
     for (int i = 0; i < PredatorList.length; i++) { 
      if (PredatorList[i].getMaxHitPoints() - PredatorList[i].getHitPoints() > difference){ 
       mostDamaged = PredatorList[i]; 
      } 
     } 
     return mostDamaged; 
    } 
    return null; 
} 

или немного лучше:

public Predator mostDamagedPredator() { 
    Predator mostDamaged = null; 
    if (PredatorList.length > 0){ 
     float difference = 0; 
     for (int i = 0; i < PredatorList.length; i++) { 
      if (PredatorList[i].getMaxHitPoints() - PredatorList[i].getHitPoints() > difference){ 
       mostDamaged = PredatorList[i]; 
      } 
     } 
    } 
    return mostDamaged; 
} 
+0

Я пробовал это, но моя переменная 'mostDamaged' в выражении if становится дублирующей локальной переменной, поэтому, когда я возвращаю' mostDamaged', он возвращает null. – BobSacamano

+1

@BobSacamano Обратите внимание, что вам не нужно повторно объявлять 'mostDamaged' внутри оператора if, просто назначьте его. См. Код в моем ответе. – Eran

+0

ох я вижу. ура! – BobSacamano

1

Вы объявили mostDamaged переменную внутри для контекста.

Объявить его, и инициализировать его там:

public Predator mostDamagedPredator() { 
// test if PredatorList contains predators 
if (PredatorList.length > 0){ 
    float difference = 0; 
    Predator mostDamaged = null; 
    for (int i = 0; i < PredatorList.length; i++) { 
     if (PredatorList[i].getMaxHitPoints() - PredatorList[i].getHitPoints() > difference){ 
      mostDamaged = PredatorList[i]; 
     } 
    } 
    return mostDamaged; // ERROR - mostDamaged cannot be resolved to a variable 
} 
// return null if there are no predators in PredatorList 
return null; 

}

0

Это происходит потому, что mostDamaged определяется в if заявлении вашего for цикла. Это означает, что вы хотите вернуть его, переменная не определена.

Вы можете переписать метод так:

public Predator mostDamagedPredator() { 
    // test if PredatorList contains predators 
    Predator mostDamaged = null; // initialize it with null 
    if (PredatorList.length > 0){ 
     float difference = 0; 
     for (int i = 0; i < PredatorList.length; i++) { 
      if (PredatorList[i].getMaxHitPoints() - PredatorList[i].getHitPoints() > difference){ 
       mostDamaged = PredatorList[i]; // assign the correct item from the array 
      } 
     } 
    } 
    // either mostDamaged was initialized in the if statement or it is still null 
    return mostDamaged; 
} 
Смежные вопросы