Почему я получаю ошибку «дубликат локальной переменной» - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть цикл, в котором я вычисляю значение и добавляю его в список.Итак, я делаю что-то вроде этого:

x = getValue()
values.add(x)
while (true) {
   x = getValue();
   values.add(x)
}

Я обнаружил, что этот подход не работает, так как я добавляю тот же экземпляр в список.Более подробно, в каждом цикле цикла я заново присваиваю новое значение x и, изменяя значения всех элементов, которые уже были добавлены в список (таким образом, в конце я получаю список идентичных элементов).

Чтобы решить эту проблему, я сделал следующее:

x = getValue();
Integer[] valueToAdd = new Integer[n];
for (int i=0; i<n; i++) {
   valueToAdd[i] = x[i];
}
while (true) {
   x = getValue();
   y = new Integer[n];
   for (int i=0; i<n; i++) {
      valueToAdd[i] = x[i];
   }
   values.add(valueToAdd)
}

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

Мне также странно, что у меня нет этой ошибки, если я объявляю одну и ту же переменную много раз в цикле.Проблема появляется, только если я сначала объявляю новую переменную вне цикла, а затем также в цикле.

Есть ли способ в Java повторно использовать одно и то же имя для разных экземпляров?

ДОБАВЛЕНО Мне нужно уточнить некоторые вопросы.Я не показал весь код.У меня есть команда break в цикле (когда новое значение не может быть сгенерировано, я выхожу из цикла).x и value имеют тип Integer[].

ДОБАВЛЕНО 2 Поскольку уже упоминалось, что проблема может быть в getValue(), мне нужно более подробно здесь.На самом деле у меня нет getValue() в моем коде (я использовал getValue() здесь, чтобы сделать мой пример короче).В моем коде у меня было:

   Integer[] x = new x[n];
    while (true) {
       for (int i=0; i<n; i++) {
          x[i] = y[i];
       }
       values.add(x)
    }

И это не сработало, поскольку в моем списке values были идентичные элементы (и я знаю, что в цикле в каждом цикле x было новое значение).

ДОБАВЛЕНО 3

Почему все элементы моего списка одинаковы?

1 Ответ

2 голосов
/ 03 декабря 2010

Ваша проблема не в том, что вы думаете. Например, взгляните на эту простую программу:

String x = null;
List<String> l = new ArrayList<String>();
for (int i = 0; i < 10; i ++) {
    x = String.valueOf(i);
    l.add(x);
}

System.out.println(l);

Он печатает числа от 0 до 9. Это потому, что java передается по значению ( проверьте здесь ). Вы не передаете ссылку на x, вы передаете значение x (в методе add).

Таким образом, проблема заключается в методе getValue(), который возвращает тот же объект.

Обновление: Теперь вопрос имеет больше смысла. Вы работаете с одним и тем же объектом x каждый раз и просто меняете его состояние. Чтобы поместить разные значения, просто переместите объявление в цикл:

while (true) {
   Integer[] x = new x[n];
   ...
}

Если вам это нужно вне цикла, просто используйте там другую переменную. Он не должен называться x. Так как вы все равно не будете использовать его внутри цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...