2016-02-25 4 views
0
public int getEntityIndex(String name){ 
    for(int i = 0; i < entities.length; i++){ 
     if(entities[i].getName().toUpperCase().equals(name.toUpperCase())){ 
      break; 
     } 
    } 

    return i; 
} 

Этот код вызывает ошибку: i не может быть разрешен переменной. Я предполагаю, что переменные, объявленные внутри объявления цикла цикла, выходят за рамки остальной части метода, но я не смог найти какую-либо информацию об этой проблеме.«... не может быть разрешено переменной». Почему нет?

После анализа кода на некоторое время, я начинаю видеть, что использование его плохая идея (что если entities[i] никогда не сравняется name? Метод вернет entities.length - 1, даже если совпадение не найдено. Я думаю, что я Л.Л. использовать while(!found) подход вместо.

чтобы уточнить, я не спрашиваю, как решить эту проблему. Я спрашиваю, почему эта ошибка происходит.

Спасибо!

+4

«Я предполагаю, что переменные, объявленные внутри для объявления петли выходят за рамки оставшейся частью методы» - Точно. Объем 'i' находится только внутри цикла' for'. – resueman

+1

Это, безусловно, дубликат, но переменная выходит за рамки. «i» существует только внутри цикла for. Когда вы покидаете цикл for, я больше не существую. Это будет работать: 'int i = 0; for (; i

+0

И почему также этот вопрос получил ответы на два миллиона одинаковых ответов ... – Smar

ответ

1

Вы не можете видеть i вне цикла for.

Попробуйте это:

public int getEntityIndex(String name) { 
    for(int i = 0; i < entities.length; i++){ 
     if(entities[i].getName().toUpperCase().equals(name.toUpperCase())){ 
      return i; 
     } 
    } 

    return -1; 
} 

PS: Вы можете также использовать

вместо

entities[i].getName().toUpperCase().equals(name.toUpperCase()) 
+0

Спасибо за подсказку! Я определенно буду менять 'toUpperCase()' на 'equalsIgnoreCase()'. Намного проще! Я буду отмечать этот ответ как правильный, поскольку он кратко отвечает на вопрос и предоставляет другую полезную информацию. Еще раз спасибо. – user1100793

+0

@ user1100793 Используя этот подход, вы также возвращаете правильное значение, прерывающее цикл for. Если цикл for заканчивается без соответствия, вы больше не возвращаете длину массива, но фиксированное значение по вашему выбору (например, -1). Вы также можете заменить окончательный возврат броском исключения. –

0

объем i является цикл for: i только существует в петле for.

Следовательно, i не может быть использован за его пределами.

+0

Спасибо за ваш ответ! – user1100793

0

i только в пределах диапазона for. Вы не можете использовать его за пределами, если вы явно не расширяете область действия, либо определяя i вне цикла, либо присваивая ее другой переменной вне цикла.

Помните, что область переменной составляет только в пределах блока, который был определен. Вы пытаетесь вернуть i, но i не существует вне цикла.

+0

Спасибо за ответ !! – user1100793

0

В последней строке вы возвращаете i. Однако переменная i была создана внутри области цикла for и не существует вне цикла for, где вы пытаетесь ее вернуть.

Вы можете вернуть i в цикл for вместо «break». Вам нужно будет вернуть что-то еще в конце.

Вы также можете инициализировать i вне цикла for.

+0

Спасибо за ваш ответ! – user1100793

0

i объявлен внутри цикла for, его область видимости находится внутри цикла. Вы не можете вернуть его, потому что он выходит за рамки.

+0

Спасибо, что ответили! – user1100793

0

Петля и все в порядке, но

return i; 

..i как переменная исчезает, когда она покидает цикл, поэтому компилятор фактически не знает, что вернуть. Вот ваше сообщение об ошибке

+0

Спасибо за ваш ответ! – user1100793

0

Вы можете использовать другую переменную для возврата значения.

public int getEntityIndex(String name){ 
int j = 0; 
    for(int i = 0; i < entities.length; i++){ 
     if(entities[i].getName().toUpperCase().equals(name.toUpperCase())){ 
      break; 
     } 
    j++; 
    } 

return j;} 
0
public int getEntityIndex(String name){ 
    for(int i = 0; i < entities.length; i++){ 
     if(entities[i].getName().toUpperCase().equals(name.toUpperCase())){ 
      return i; // If found return [i] 
     } 
    } 
    return -1; //[i] was not found and return = -1; 
} 
Смежные вопросы