2013-07-08 3 views
0

Je voudrais être en mesure de créer quelque chose comme ceci:Essayer de créer un tableau structuré Java

int points = 250; 

public class point { 

    float x, y; 

} 

point[] p = new point[points]; 

// constructor 
public JavaMain() { 

    Random r = new Random(); 

    for (int i = 0; i < points; i++) { 

     int tx = r.nextInt(640) + 1; 
     int ty = r.nextInt(480) + 1; 

     p[i].x = (float)tx; 
     p[i].y = (float)ty; 

    } 
} 

Le problème est que cela jette un NullPointerException en essayant d'attribuer une valeur à p[i].x ou p[i].y

C'est ma première journée sur Java et j'ai fait des recherches via Google et StackOverflow mais je n'ai rien découvert qui soit au coeur du problème.

+0

Exception dans le thread « principal » java.lang.NullPointerException – cookertron

+0

Vous devez initialiser les éléments dans le tableau et pas un tableau juste référence –

+0

Pouvez-vous me donner un exemple s'il vous plaît ? – cookertron

Répondre

8

L'exception NullPointerException que vous obtenez est causée par cette ligne:

p[i].x = (float)tx; 

où vous essayez d'accéder à l'attribut x de l'objet stocké à l'intérieur du tableau p à la position i, mais cet élément (ou tout autre élément à l'intérieur de ce tableau) n'a pas encore été défini et est égal à null.

Pour corriger cela, ajoutez cette ligne au-dessus de la ligne mentionnée:

p[i] = new point(); 
+0

Parfait, merci! – cookertron

+0

Cela semble étrange de le faire de cette façon. Je pensais qu'il allouerait de l'espace pour l'ensemble du tableau sur la déclaration initiale, comme dans d'autres langages orientés objet. – cookertron

+0

Puisque 'point' n'est pas un type primitif, le compilateur est incapable de comprendre comment initialiser un tableau de ce type. Par curiosité, dans quel langage orienté objet cela fonctionne différemment? –

1

Le problème est que si vous avez initialisé le tableau, vous n'avez pas les éléments initialisez du tableau.

Sur cette ligne que vous avez

point[] p = new point[points]; 

Alors maintenant, p est initialisé à un tableau de points avec la longueur points

Cependant, vous pouvez imaginer que dans ce tableau, les objets point individuels sont non initialisée (donc tout nul). Ainsi, lorsque vous appelez p[i].x = (float)tx;, vous déréférencez l'objet point à p [i], mais p [i] n'est pas initialisé, donc vous déréférencer un pointeur nul.

Vous faites l'équivalent de

point p; 
p.x = 5; 
+0

Merci pour l'explication détaillée. Je comprends maintenant. Comme je l'ai mentionné plus haut, il semble étrange d'avoir à initialiser les éléments après avoir initialisé le tableau. En C++, une fois que vous avez alloué la mémoire pour un tableau, l'index du tableau pointe vers la position dans la mémoire et la structure pointe vers le décalage. – cookertron

+0

Vous êtes les bienvenus! Je peux comprendre votre confusion. Cependant, il est un peu différent parce que nous avons affaire à un tableau de références Java, donc en C++ syntaxe, ce que vous feriez est point de * p [] donc vous pouvez imaginer si vous avez fait quelque chose comme p [i] .x dans cette situation, vous obtiendrez également une référence nulle en C++ –

Questions connexes