【问题标题】:Why do I get a "duplicate local variable" error?为什么会出现“重复的局部变量”错误?
【发布时间】:2010-12-03 09:20:19
【问题描述】:

我有一个循环,我在其中计算一个值并将其添加到一个列表中。所以,我做了这样的事情:

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 命令(当无法生成新值时,我退出循环)。 xvalue 具有 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 个

Why all elements of my list seems to be the same?

【问题讨论】:

  • “x”的类型是什么?这些循环怎么会永远运行?您描述为“重复的局部变量错误”的错误的实际文本是什么?
  • @EJP,我在循环中有 break 命令(当无法生成新值时,我退出循环)。 x 和 value 具有 Integer[] 类型。
  • 这个问题非常不清楚。似乎也没有真正需要解决的问题,也没有任何真正的代码或错误消息。
  • 没有提供实际的文本,也没有提供任何表现出任何此类问题的代码。 @Bombe:完全正确。

标签: java duplicates local-variables


【解决方案1】:

你的问题不是你想的那样。例如看一下这个简单的程序:

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 是按值传递的 (check here)。您不是在传递对 x 的引用,而是在传递 x 的值(在 add 方法中)。

所以问题出在getValue()方法上,它返回的是同一个对象。

更新:现在这个问题更有意义了。您每次都在使用相同的对象x,并且只是更改其状态。为了放置不同的值,只需在循环内移动声明:

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

如果您在循环之外需要它,那么只需在此处使用另一个变量即可。它不必命名为x。因为无论如何你都不会在循环中使用它。

【讨论】:

  • 对不起,我认为那是错误的。您的正确 java 使用按值传递,但 x 的值是对 getValue() 结果的引用。还是我错过了什么?
  • 好吧,试试上面的代码。如果问题是局部变量,它会打印 9,9,9,9,9,9,9,而不是 0,1,2,3, ...
  • @Bozho,你的例子能不能只是因为在你的情况下x 是一个字符串,而在我的情况下xInteger[] 类型?
  • @Bozho,我在我原来的问题中添加了一些额外的信息(关于getValue())。此处提供了有关我遇到的问题的更多信息:stackoverflow.com/questions/4324754/…
  • @Bozho,我开始在while 循环之前使用x。这就是为什么我需要在循环之前声明它。如果我尝试在循环中声明它,我会遇到duplicate local variable 问题。
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多