Erreur java.lang.NullPointerException - Java - Programmation
Marsh Posté le 19-07-2006 à 10:30:39
Code :
|
ça sert à quoi de déclarer un tableau de taille 1 ?
Marsh Posté le 19-07-2006 à 10:31:08
Peut-être qu'il faudrait nous dire quel est ton probléme... on ne peux pas tout deviner ;-) Et envoie la Stack Trace de ton exception (si il y en a une)
edit : pas vu le titre
Marsh Posté le 19-07-2006 à 10:34:31
peut etre que je me trompe mais si je mets ma variable toute seule (pas dans un tableau) au retour de ma fonction, je n'aurais pas les modifications qui ont été faite dans cette fonction (comme ce n'est pas ce que je renvoie) non?
L'erreur c'est une exception java.lang.NullPointerException.
Marsh Posté le 19-07-2006 à 10:35:28
Oui mais envoie ta Stack Trace...on ne peut pas deviner d'ou vient cette exception.
Marsh Posté le 19-07-2006 à 10:37:34
et en plus quand tu écris ça :
mick8569 a écrit :
|
certes, c'est bien beau d'instancier XtNode, mais si tu ne le renvoies pas, alors il est détruit à la fin de la fonction => BOUM (sauf s'il s'agit d'une variable membre, ce qui ne semble pas être le cas ici)
ne me dit pas que ce truc élémentaire t'a échappé ?
Marsh Posté le 19-07-2006 à 10:39:14
en plus, je vois même pas à quoi sert l'argument xt dans cette fonction... bref, conception à revoir
Marsh Posté le 19-07-2006 à 10:44:12
et le cast de la ligne 5, il sert à quoi puisque xt est déjà un XtDataNode ? je sais pas si tu te rends compte que t'as fait n'importe quoi là
Marsh Posté le 19-07-2006 à 10:57:01
Si il sert dans la fonction split.
En gros pour t'expliquer rapidement le truc, je modélise un arbre X.
L'idée de ces arbres, c'est que quand je dois insérer une donnée sur un noeud, si il n'y a plus de place, l'ensemble de ces données est répartie en deux groupes (deux groupes déterminés selon plusieurs critères).
Donc dans la fonction split, les deux groupes sont determinés puis répartis sur le noeud this et sur le noeud xt comme ca je peux récupérer mes deux noeuds.
J'ai retourné le problème dans tous les sens, et je n'ai pas trouvé d'autre solutions puisque dans la fonction split je dois aussi renvoyé un autre paramètre qui me dit quel type d'opération a été faite pour savoir ce que je dois faire par la suite (il y a en tout 3 types d'opérations). Ce qui fait qu'avec cette fonction, je dois récupérer deux informations : le type d'opération et le deuxième noeud.
En c++ j'aurais résolu le problème par un double pointeur (par exemple : insert (Data obj, XtNode **xt) mais la je n'ai pas trouvé d'autres solutions que mettre la variable dans un tableau. Si tu en as une je suis ouvert à toute proposition
Voila.
[quote="Harkonnen"]certes, c'est bien beau d'instancier XtNode, mais si tu ne le renvoies pas, alors il est détruit à la fin de la fonction => BOUM (sauf s'il s'agit d'une variable membre, ce qui ne semble pas être le cas ici) [/quote]
J'avais très bien vu, seulement je croyais que comme c'était un tableau y avait une magouille quelconque qui faisait que je pouvais y récupérer... bref je me suis trompé apparemment
Marsh Posté le 19-07-2006 à 11:00:08
Par contre le cast est obligatoire : cf regarde les en-tete des fonctions
Si je ne fais pas ce cast ca fait une erreur dans les types
Marsh Posté le 19-07-2006 à 11:03:04
mick8569 a écrit : J'avais très bien vu, seulement je croyais que comme c'était un tableau y avait une magouille quelconque qui faisait que je pouvais y récupérer... bref je me suis trompé apparemment |
ben ça tombe pourtant sous le sens !
dans ta fonction principale, tu instancies XtNode en créant la variable newnode, OK. puis tu transmets cette variable en paramètre à une fonction, et dans ladite fonction tu ne trouves rien de mieux que de réassigner cette variable à un autre objet (donc déjà tu peux dire adieu à ta référence XtNode) sans la renvoyer (donc détruite à la fin de la fonction), donc faut pas t'étonner si tu as une NullPointerException hein
Marsh Posté le 19-07-2006 à 11:06:17
tu as juste à modifier ta variable, pas besoin de tableau, déjà.
au début de insert, ta première action est de détruire ton paramètre xt par une affectation, donc la valeur de ce que tu as passé en paramètre est perdue, quoi qu'il arrive. donc c'est plus une création qu'une insertion, en même temps, c'est peut-être ce que tu veux faire.
et tu retournes toujours la même valeur, dans tes deux fonctions.
quel est l'interet de retourner quelque chose, si c'est toujours la même chose, ici des constantes ?
Marsh Posté le 19-07-2006 à 11:06:46
mick8569 a écrit : Par contre le cast est obligatoire : cf regarde les en-tete des fonctions |
Code :
|
étant donné que xt[0] est défini dans la fonction comme étant de type XtDataNode, je vois vraiment pas en quoi le cast en XtDataNode est obligatoire ! ou alors y'a un truc qui m'échappe
Marsh Posté le 19-07-2006 à 11:10:05
arf en fait j'ai réduit les fonctions, dans ce que j'ai mis je renvoie toujours la meme constante mais elle est bien plus longue, j'ai mis que ce qui posait problème.
Pour le cast effectivement, t'as raison mais avec les modifs que j'avais faite j'avais pas fait attention qu'il n'était plus utile. Mais la j'ai remodifié et il est indispensable :
le xt = new XtDataNode [1] ne sert effectivement à rien
Marsh Posté le 19-07-2006 à 11:16:30
Non car il est initialisé avant l'appel de la fonction :
Code :
|
En tout cas, ce cast est obligatoire :
Code :
|
Si je ne le fais pas, eclipse me met une erreur....
Après je sais pas, ptet je fais une erreur
Marsh Posté le 19-07-2006 à 11:18:53
brisssou a écrit : c'est quoi la signature de split ?! |
Code :
|
Marsh Posté le 19-07-2006 à 11:20:09
à moins que ce con de Java ne prenne comme type pour xt le type qui a été passé en paramètre (XtNode) ?
Marsh Posté le 19-07-2006 à 11:35:56
Harkonnen a écrit : et en plus quand tu écris ça : |
Il essaie d'utiliser son tableau (fourni en entrée) comme un out parameter
Harkonnen a écrit : à moins que ce con de Java ne prenne comme type pour xt le type qui a été passé en paramètre (XtNode) ? |
Ben oui, xt est un XtNode[], après il instancie un XtDataNode[] dedans mais celui-ci est automagiquement downcasté en XtNode[], donc il faut reupcaster les objets contenus dans xt en XtDataNode[].
mick5468 => Quel est l'intérêt de la constante à la con que tu renvoies? Pourquoi ne pas envoyer directement l'objet que tu as généré?
Marsh Posté le 19-07-2006 à 12:29:25
masklinn a écrit : Il essaie d'utiliser son tableau (fourni en entrée) comme un out parameter |
j'avais compris
d'ailleurs j'ai jamais compris l'intéret des parameters out (sauf peut etre pour renvoyer plusieurs trucs à la fois, mais y'a toujours moyen de faire autrement), je trouve ça hyper crade.
masklinn a écrit : |
y'a que moi à trouver ça complètement con ? xt est une référence vers XtNode. on réutilise cette référence pour creer un objet d'un autre type, et il faut quand même caster parce que l'ancien type a été conservé ? c'est très con non ?
Marsh Posté le 19-07-2006 à 13:27:56
Harkonnen a écrit : d'ailleurs j'ai jamais compris l'intéret des parameters out (sauf peut etre pour renvoyer plusieurs trucs à la fois, mais y'a toujours moyen de faire autrement), je trouve ça hyper crade. |
Créer des effets de bord, c'est marrant les effets de bord, surtout quand tu dis pas qu'il y en a
Harkonnen a écrit : y'a que moi à trouver ça complètement con ? xt est une référence vers XtNode. on réutilise cette référence pour creer un objet d'un autre type, et il faut quand même caster parce que l'ancien type a été conservé ? c'est très con non ? |
It's Java, dude
Et accessoirement C# fait très probablement pareil hein
Marsh Posté le 19-07-2006 à 13:39:52
C# fait effectivement pareil:
Code :
|
=> pas OK
Error 1 Cannot implicitly convert type 'ConsoleApplication1.Foo' to 'ConsoleApplication1.Bar'. An explicit conversion exists (are you missing a cast?) |
Par contre
Code :
|
=> OK
Marsh Posté le 19-07-2006 à 14:01:13
C'est bon j'ai réussi a résoudre mon problème :
en fait il suffisait tout simplement que j'enleve cette ligne de ma fonction insert :
xt = new XtDataNode [1];
et que je le fasse avant l'appel de la fonction.
Pour info, le paramètre que je renvoie m'indique ce qui a été fait dans la fonction. Il y a 3 cas différent qui influence ce qui est fait après l'insert, c'est donc nécessaire que je sache ce qui a été fait
Marsh Posté le 19-07-2006 à 14:11:08
Et pour répondre a harkonnen, je te soutiens moi aussi je trouve ca con de devoir le recaster
Marsh Posté le 19-07-2006 à 14:16:17
masklinn a écrit : C# fait effectivement pareil: |
et ben c'est poori
Marsh Posté le 19-07-2006 à 14:18:03
c'est comme quand tu fais
Iterator it = new ArrayList().listIteraotr();
tu as pas accès aux méthodes spécifiques de ListIterator sur it, puisque tu as dit que c'est un Iterator. Ici pareil, tu as dis XtNode, c'est pas XtDataNode, tu n'as qu'à changer la signature de ta méthode.
Marsh Posté le 19-07-2006 à 14:52:02
mick8569 a écrit : Et pour répondre a harkonnen, je te soutiens moi aussi je trouve ca con de devoir le recaster |
Harkonnen a écrit : et ben c'est poori |
Ah mais j'dis pas que c'est pas stupide hein, juste que c'est comme ça, maintenant si vous êtes pas d'accord faut arrêter d'utiliser ces langages à la con
Marsh Posté le 19-07-2006 à 16:04:13
de toute façon, j'utilise jamais l'héritage, donc cette feature à la con ne me concerne pas
Marsh Posté le 20-07-2006 à 21:11:24
Harkonnen a écrit : de toute façon, j'utilise jamais l'héritage |
k lol
Marsh Posté le 19-07-2006 à 10:27:36
Salut à tous!
J'ai une petite erreur que je n'arrive pas à comprendre :
Tout d'abord j'ai fait une classe XtDataNode dont la classe mère est la classe XtNode (dans cette classe, un des variable est un tableau : Data[]data). (ca ne sert a rien que j'explique la classe Data pour ce problème)
Voici ce que je fait dans une première fonction :
Or je ne comprends pas car dans la fonction insert que j'appelle, ma variable aurait du etre instancié :
Fonction insert :
Et dans la fonction split :
Voila si quelqu'un voit d'ou peut venir le problème!
Merci!