Je vais plonger rapidement au problème. J’ai un cours simple
class Vector{ float x, y; }
et une autre classe a un tableau de ces objects en tant que membre
Vector[] buffer;
Je l’initialise comme ceci:
buffer = new Vector[8]; for(Vector v: buffer) v = new Vector();
mais lorsque j’essaie d’accéder aux membres de cet object dans ce tableau, j’obtiens une exception NullPointerException directement dans ma trace de stack. C’est-à-dire que les objects du tableau n’ont pas été construits. D’autre part, ce code plus traditionnel fonctionne parfaitement:
buffer = new Vector[8]; for(int i = 0; i<8; i++) buffer[i] = new Vector;
Comme le souligne cette discussion, les deux devraient être les mêmes après la compilation.
Ma question est la suivante: pourquoi chaque boucle ne parvient-elle pas à initialiser / construire des objects à partir du tableau d’éléments?
Dans votre exemple pour-each, vous écrasez la variable locale de la boucle qui n’est pas sauvegardée dans le tableau. Cela ressemble à votre deuxième boucle:
for(int i = 0; i < buffer.length; i++){ Vector v = buffer[i]; v = new Vector(); }
Consultez Comprendre pour chaque boucle en Java le même problème.
Les deux boucles sont les mêmes pour accéder aux éléments d’un tableau, mais pas pour les initialiser. Lorsque vous utilisez une boucle for-each dans ce scénario, c’est comme si vous faisiez
for(int x = 0; x < array.length; x++) { Vector v = array[x]; v = new Vector(); }
Vous n'affectez pas le nouveau Vector
au tableau, vous l'assignez plutôt à une variable locale.
Dans votre premier exemple, v
est disponible uniquement dans la boucle for. Quand vous faites v = new Vector();
v est mis à jour, mais pas le tampon [i]. v pointait auparavant vers le tampon [i], il pointe maintenant vers un nouveau vecteur, le buffer[i]
rest à l’état null
.