Erreur java.lang.NullPointerException

Erreur java.lang.NullPointerException - Java - Programmation

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 :

Code :
  1. XtNode [] newNode = new XtNode [1];
  2. returnValue = ((Node)root).insert(obj, newNode);
  3. if (returnValue == Constants.SPLIT)
  4. {
  5.   de = new DirEntry (this);
  6.   de.setSon(newNode[0]);
  7.   de.setMbr (((Node)newNode[0]).getMbr()); // ici erreur java.lang.NullPointerException
  8. }


Or je ne comprends pas car dans la fonction insert que j'appelle, ma variable aurait du etre instancié :
Fonction insert :

Code :
  1. public int insert (Data obj, XtNode []xt)
  2. {
  3.   xt = new XtDataNode[1];
  4.   xt[0] = new XtDataNode (this.myTree, null);
  5.   split ((XtDataNode)xt[0]);
  6.   return Constants.SPLIT;
  7. }


 
Et dans la fonction split :

Code :
  1. public boolean split (XtDataNode brother)
  2. {
  3.   int n = this.nbEntries;
  4.   Data [][] newData;
  5.   newData = topological_split();
  6.   this.data = newData[0];
  7.   brother.data = newData[1];
  8.   this.nbEntries = newData[0].length;
  9.   brother.nbEntries = n - newData[0].length;
  10.   return true;
  11. }


 
Voila si quelqu'un voit d'ou peut venir le problème!
Merci!

Reply

Marsh Posté le 19-07-2006 à 10:27:36   

Reply

Marsh Posté le 19-07-2006 à 10:30:39    

Code :
  1. XtNode [] newNode = new XtNode [1];


ça sert à quoi de déclarer un tableau de taille 1 ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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

Reply

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.

Reply

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.

Reply

Marsh Posté le 19-07-2006 à 10:36:42    

tu te trompe, java marche par référence, et pas par valeur (enfin c'est plus compliqué, faut lire la doc)


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 10:37:34    

et en plus quand tu écris ça :

mick8569 a écrit :


Or je ne comprends pas car dans la fonction insert que j'appelle, ma variable aurait du etre instancié :
Fonction insert :

Code :
  1. public int insert (Data obj, XtNode []xt)
  2. {
  3.   xt = new XtDataNode[1];
  4.   xt[0] = new XtDataNode (this.myTree, null);
  5.   split ((XtDataNode)xt[0]);
  6.   return Constants.SPLIT;
  7. }



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é ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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


Message édité par Harkonnen le 19-07-2006 à 10:40:03

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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à


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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

Reply

Marsh Posté le 19-07-2006 à 10:57:01   

Reply

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

Reply

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 [:skeye]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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 ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

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
Si je ne fais pas ce cast ca fait une erreur dans les types


Code :
  1. public int insert (Data obj, XtNode []xt)
  2. {
  3.      xt = new XtDataNode[1];
  4.      xt[0] = new XtDataNode (this.myTree, null);   
  5.      split ((XtDataNode)xt[0]);
  6.      return Constants.SPLIT;
  7. }


é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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-07-2006 à 11:07:04    

Citation :

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


 
[:rofl2]


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 11:08:00    

essye sans le cast, et pouf! ça marche quand même...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

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

Reply

Marsh Posté le 19-07-2006 à 11:11:45    

si, à initialiser ton tableau...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 11:16:30    

Non car il est initialisé avant l'appel de la fonction :

Code :
  1. xt = new XtDataNode[1];
  2. insert (obj, xt);


 
En tout cas, ce cast est obligatoire :

Code :
  1. xt[0] = new XtDataNode (this.myTree, null);
  2. split ((XtDataNode)xt[0]);


 
Si je ne le fais pas, eclipse me met une erreur....
 
Après je sais pas, ptet je fais une erreur  :sol:

Reply

Marsh Posté le 19-07-2006 à 11:17:14    

c'est quoi la signature de split ?!


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 11:18:12    

public boolean split (XtDataNode brother)

Reply

Marsh Posté le 19-07-2006 à 11:18:53    

brisssou a écrit :

c'est quoi la signature de split ?!


Code :
  1. public boolean split (XtDataNode brother)
  2.     {
  3.      int n = this.nbEntries;
  4.      Data [][] newData;
  5.            
  6.      newData = topological_split();
  7.    
  8.      this.data = newData[0];
  9.      brother.data = newData[1];
  10.      this.nbEntries = newData[0].length;
  11.      brother.nbEntries = n - newData[0].length;
  12.      return true;
  13.     }


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-07-2006 à 11:24:34    

ok, cast obligatoir.
 
c'est quoi ton soucis déjà ? ^_^


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-07-2006 à 11:35:56    

Harkonnen a écrit :

et en plus quand tu écris ça :
 
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é ?


Il essaie d'utiliser son tableau (fourni en entrée) comme un out parameter [:pingouino]

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é?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 [:pingouino]


j'avais compris [:pingouino]
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 :


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[].


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 ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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 [:dawa]

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 [:spamafote]
 
Et accessoirement C# fait très probablement pareil hein [:spamafote]


Message édité par masklinn le 19-07-2006 à 13:34:57

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-07-2006 à 13:39:52    

C# fait effectivement pareil:

Code :
  1. namespace ConsoleApplication1 {
  2.    class Foo {
  3.    }
  4.    class Bar : Foo {
  5.    }
  6.    class Program {
  7.        static void Main(string[] args) {
  8.            Foo[] foo = null;
  9.            Test(foo);
  10.        }
  11.        static void Test(Foo[] foo) {
  12.            foo = new Bar[1];
  13.            foo[0] = new Bar();
  14.  
  15.            Bar bar = foo[0];
  16.        }
  17.    }
  18. }


=> 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 :
  1. namespace ConsoleApplication1 {
  2.    class Foo {
  3.    }
  4.    class Bar : Foo {
  5.    }
  6.    class Program {
  7.        static void Main(string[] args) {
  8.            Foo[] foo = null;
  9.            Test(foo);
  10.        }
  11.        static void Test(Foo[] foo) {
  12.            foo = new Bar[1];
  13.            foo[0] = new Bar();
  14.  
  15.            Bar bar = (Bar)foo[0];
  16.        }
  17.    }
  18. }


=> OK

Message cité 1 fois
Message édité par masklinn le 19-07-2006 à 13:40:34

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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

Reply

Marsh Posté le 19-07-2006 à 14:07:15    

c'était pas évident avec le code que tu nous as fourni


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

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

Reply

Marsh Posté le 19-07-2006 à 14:16:17    

masklinn a écrit :

C# fait effectivement pareil:


et ben c'est poori [:mlc]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

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 [:mlc]


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 :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 [:natas]

Reply

Marsh Posté le 20-07-2006 à 21:11:24    

Harkonnen a écrit :

de toute façon, j'utilise jamais l'héritage


k lol


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed