pour chaque boucle ne peut pas initialiser les objects du tableau

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 .