2010-12-03 6 views
0

J'ai une boucle dans laquelle je calcule une valeur et je l'ajoute à une liste. Alors, je fais quelque chose comme ça:Pourquoi une erreur "dupliquer la variable locale" s'affiche-t-elle?

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

Je trouve que cette approche ne fonctionne pas parce que j'ajoute la même instance à la liste. En plus de détails, dans chaque cycle de la boucle, je réattribue une nouvelle valeur au x et ainsi je change les valeurs de tous les éléments qui ont déjà été ajoutés à la liste (donc à la fin j'obtiens une liste d'éléments identiques).

Pour résoudre ce problème, je l'ai fait ce qui suit:

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) 
} 

De cette façon, je voulais créer une nouvelle instance à chaque fois que veulent ajouter une valeur à la liste. Mais cela ne fonctionne pas puisque j'obtiens une erreur de variable locale en double.

Il est également étrange pour moi que je n'ai pas cette erreur si je déclare la même variable plusieurs fois dans la boucle. Le problème n'apparaît que si je déclare d'abord une nouvelle variable en dehors de la boucle, puis également dans la boucle.

Est-il possible en Java de réutiliser le même nom pour différentes instances?

AJOUT Je dois clarifier certains problèmes. Je n'ai pas montré tout le code. J'ai la commande break dans la boucle (quand une nouvelle valeur ne peut pas être générée, je quitte la boucle). x et value ont Integer[] type.

2 AJOUTÉE Comme il a été mentionné que le problème peut être dans le getValue() je dois en plus de détails ici. En fait, je n'ai pas getValue() dans mon code (j'ai utilisé getValue() ici pour rendre mon exemple plus court). Dans mon code, j'avais:

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

Et cela n'a pas fonctionné depuis dans ma liste values j'avais des éléments identiques (et je sais que dans la boucle sur chaque cycle x avait une nouvelle valeur).

AJOUTÉE 3

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

+0

Quel est le type de 'x'? Comment se fait-il que ces boucles fonctionnent pour toujours? Quel est le * texte réel * de l'erreur que vous décrivez comme "une erreur de variable locale en double"? – EJP

+0

@EJP, j'ai la commande break dans la boucle (quand une nouvelle valeur ne peut pas être générée, je quitte la boucle). x et value ont le type Integer []. – Roman

+1

Cette question est * extrêmement * peu claire. Il ne semble pas non plus y avoir de véritable problème à résoudre, ni de véritable code ou message d'erreur. – Bombe

Répondre

2

Votre problème n'est pas ce que vous pensez qu'il est. Par exemple jeter un oeil à ce programme simple:

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); 

Il imprime les chiffres de 0 à 9. C'est parce que java est passe par valeur (check here). Vous ne passez pas la référence à x, vous passez la valeur de x (dans la méthode add). Donc, le problème réside dans la méthode getValue(), qui retourne le même objet.

Mise à jour: Maintenant, la question a plus de sens. Vous travaillez avec le même objet x à chaque fois, et juste en changeant son état.Afin de mettre des valeurs différentes il suffit de déplacer la déclaration dans la boucle:

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

Si vous en avez besoin en dehors de la boucle, eh bien, il suffit d'utiliser une autre variable. Il ne doit pas être nommé x. Puisque vous ne l'utiliserez pas dans la boucle de toute façon.

+0

Désolé, je pense que c'est faux. Votre java de droite utilise une valeur de passe mais la valeur de 'x' est la référence au résultat de' getValue() '. Ou est-ce que je manque quelque chose? – scheffield

+0

bien, essayez le code ci-dessus. Si le problème était la variable locale, il aurait imprimé 9,9,9,9,9,9,9, plutôt que 0,1,2,3, ... – Bozho

+0

@Bozho, peut-il être que votre exemple fonctionne seulement parce que dans votre cas 'x' est une chaîne et dans mon cas' x' a un type 'Integer []'? – Roman

Questions connexes