Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1726 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Erreur java.lang.NullPointerException

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur java.lang.NullPointerException

n°1409165
mick8569
Posté le 19-07-2006 à 10:27:36  profilanswer
 

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!

mood
Publicité
Posté le 19-07-2006 à 10:27:36  profilanswer
 

n°1409173
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 10:30:39  profilanswer
 

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)
n°1409175
brasseld
Posté le 19-07-2006 à 10:31:08  profilanswer
 

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

n°1409181
mick8569
Posté le 19-07-2006 à 10:34:31  profilanswer
 

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.

n°1409183
brasseld
Posté le 19-07-2006 à 10:35:28  profilanswer
 

Oui mais envoie ta Stack Trace...on ne peut pas deviner d'ou vient cette exception.

n°1409186
brisssou
8-/
Posté le 19-07-2006 à 10:36:42  profilanswer
 

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
n°1409189
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 10:37:34  profilanswer
 

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)
n°1409192
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 10:39:14  profilanswer
 

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)
n°1409197
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 10:44:12  profilanswer
 

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)
n°1409217
mick8569
Posté le 19-07-2006 à 10:57:01  profilanswer
 

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

mood
Publicité
Posté le 19-07-2006 à 10:57:01  profilanswer
 

n°1409224
mick8569
Posté le 19-07-2006 à 11:00:08  profilanswer
 

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

n°1409227
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 11:03:04  profilanswer
 

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)
n°1409232
brisssou
8-/
Posté le 19-07-2006 à 11:06:17  profilanswer
 

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
n°1409234
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 11:06:46  profilanswer
 

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)
n°1409235
brisssou
8-/
Posté le 19-07-2006 à 11:07:04  profilanswer
 

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
n°1409237
brisssou
8-/
Posté le 19-07-2006 à 11:08:00  profilanswer
 

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
n°1409241
mick8569
Posté le 19-07-2006 à 11:10:05  profilanswer
 

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

n°1409246
brisssou
8-/
Posté le 19-07-2006 à 11:11:45  profilanswer
 

si, à initialiser ton tableau...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1409256
mick8569
Posté le 19-07-2006 à 11:16:30  profilanswer
 

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:

n°1409258
brisssou
8-/
Posté le 19-07-2006 à 11:17:14  profilanswer
 

c'est quoi la signature de split ?!


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1409259
mick8569
Posté le 19-07-2006 à 11:18:12  profilanswer
 

public boolean split (XtDataNode brother)

n°1409262
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 11:18:53  profilanswer
 

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)
n°1409263
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 11:20:09  profilanswer
 

à 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)
n°1409275
brisssou
8-/
Posté le 19-07-2006 à 11:24:34  profilanswer
 

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
n°1409294
masklinn
í dag viðrar vel til loftárása
Posté le 19-07-2006 à 11:35:56  profilanswer
 

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
n°1409345
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 12:29:25  profilanswer
 

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)
n°1409367
masklinn
í dag viðrar vel til loftárása
Posté le 19-07-2006 à 13:27:56  profilanswer
 

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
n°1409375
masklinn
í dag viðrar vel til loftárása
Posté le 19-07-2006 à 13:39:52  profilanswer
 

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
n°1409389
mick8569
Posté le 19-07-2006 à 14:01:13  profilanswer
 

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

n°1409396
brisssou
8-/
Posté le 19-07-2006 à 14:07:15  profilanswer
 

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
n°1409401
mick8569
Posté le 19-07-2006 à 14:11:08  profilanswer
 

Et pour répondre a harkonnen, je te soutiens moi aussi je trouve ca con de devoir le recaster ;)

n°1409406
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 14:16:17  profilanswer
 

masklinn a écrit :

C# fait effectivement pareil:


et ben c'est poori [:mlc]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1409409
brisssou
8-/
Posté le 19-07-2006 à 14:18:03  profilanswer
 

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
n°1409456
masklinn
í dag viðrar vel til loftárása
Posté le 19-07-2006 à 14:52:02  profilanswer
 

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
n°1409545
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-07-2006 à 16:04:13  profilanswer
 

de toute façon, j'utilise jamais l'héritage, donc cette feature à la con ne me concerne pas [:natas]

n°1410639
the real m​oins moins
Posté le 20-07-2006 à 21:11:24  profilanswer
 

Harkonnen a écrit :

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


k lol


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Erreur java.lang.NullPointerException

 

Sujets relatifs
erreur ClassCastExceptionerreur définie par l'application ou par l'objet résolu
Erreur ACCESScherche un IDE pr java
[LDAP/JAVA] value of naming attribute 'cn' is not present in entryjava.nio.FileLock et FileChannel: équivalent en 1.3.1
Exception in thread "main".java.lang.StringIndexOutOfBoundsExceptionUn intranet (portail, cms) en JAVA ? (Liferay - Jahia...)
API java pour du ftp 
Plus de sujets relatifs à : Erreur java.lang.NullPointerException


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR