2015-06-05 3 views
6

Может кто-то пожалуйста просветить меня по следующему вопросу:Объявление переменной Вне Foreach Loop в Java

public class Loopy { 
    public static void main(String[] args) 
    { 
     int[] myArray = {7, 6, 5, 4, 3, 2, 1}; 

     int counterOne; 
     for (counterOne = 0; counterOne < 5; counterOne++) { 
      System.out.println(counterOne + " "); 
     } 
     System.out.println(counterOne + " "); 

     int counterTwo = 0; 
     for (counterTwo : myArray) { 
      System.out.println(counterTwo + " "); 
     } 

    } 

} 

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

В цикле foreach мы также объявляем counterTwo вне цикла, а затем используем его внутри цикла. Тем не менее, ошибка возникает в этом случае:

«Исключение в потоке„основного“java.lang.RuntimeException: Uncompilable исходный код - не может найти символ символа: класс counterTwo местоположение: класс package1.Loopy»

Помогите мне понять почему?

Единственное различие между ними состоит в том, что counterOne инициализируется нулем, а затем присваивается значения пошагово (меньше 5).

В цикле foreach counterTwo присваивается один за другим каждый элемент массива.

Программа работает, если сделать эту настройку в секунду для цикла: for(int counterTwo : myArray), в то время как первый для работы в обоих случаях:

  1. существующий
  2. for (counterOne = 0; counterOne < 5; counterOne++)
+1

Я переименовал переменные в коде для целей удобочитаемости для других людей, которые могут возникнуть по этому вопросу (я лично никогда не пробовал и нашел это интересным). –

ответ

11

От this section of the Java Language Specification об усилении for -loops:

Усиленный для заявления имеет вид:

EnhancedForStatement:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) Statement

EnhancedForStatementNoShortIf:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) StatementNoShortIf

Обратите внимание, что объявление типа UnannType должно присутствовать в цикле for. Поэтому вы должны написать цикл следующим образом:

for (int z : x) { 
0

Это всего лишь синтаксис a для каждого цикла. Вы не можете использовать переменную, определенную внутри каждого цикла вне самого цикла. Именно так определяется язык.

https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

+0

Я думаю, что вам не хватает точки вопроса. –

2

Ну, что делает его простым, второй является «особенным» для, это на самом деле «для каждого». Внутри всегда требуется декларация переменной. Вместо того, чтобы объяснить это плохо, здесь вы ссылку на старый вопрос об этом, проверить это: Why is declaration of the variable required inside a foreach loop

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