NullPointerException avec la methode equals et split !!!! [Résolu]

NullPointerException avec la methode equals et split !!!! [Résolu] - Java - Programmation

Marsh Posté le 11-03-2005 à 14:12:39    

Alors là !!! Ca me sidère... !!  :ouch:  
 
Et en plus comme ca fait 1H que je cherche, ca me rend fou !!!  :fou:  
 
Je parcours un fichier ligne par ligne, et je veux faire un traitement spécial si la ligne contient

new_topic


Donc je fais :

if(lu.equals("new_topic" ))


 
Et bah ca me balance un NullPointerException !!!! Arghhhhh
 
 
Please help ! :pt1cable:
---------------------------------------------------------------------
 
Edit :
Le topic original ne parlait que de mon prb avec le equals, et avec cet edit, je rajoute mon prb avec le split !!!!
--> voir plus bas dans le topic :http://forum.hardware.fr/forum2.ph [...] 9#t1014160


Message édité par dcvlm le 16-03-2005 à 09:16:40

---------------
ZZZZzzzzz
Reply

Marsh Posté le 11-03-2005 à 14:12:39   

Reply

Marsh Posté le 11-03-2005 à 14:15:56    

Ca va être dur de t'aider si tu nous dis pas d'où sort la varaible 'lu' ;)

Reply

Marsh Posté le 11-03-2005 à 14:20:15    

C une bete string extraite d'un bete.txt:


BufferedReader in = new BufferedReader(new FileReader("chemin" ));
lu=in.readLine();


(le tout dans une boucle while...)
 
 
Merci ! :hello:


---------------
ZZZZzzzzz
Reply

Marsh Posté le 11-03-2005 à 14:20:51    

dcvlm> lu est probablement nulle.
 
y'a des gens qui justement conseillent de toujour écrire l'égalité à l'envers : "chaine".equals(variable)
 
ou dans Eiffel, y'a une fonction statique equals(v1, v2) qui prend en cherge le null.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 11-03-2005 à 14:25:35    

dcvlm a écrit :

C une bete string extraite d'un bete.txt:


BufferedReader in = new BufferedReader(new FileReader("chemin" ));
lu=in.readLine();


(le tout dans une boucle while...)
 
 
Merci ! :hello:


Ca me dit toujours pas ce qu'est le 'lu' ;)  
 
Bon sinon, c'est le readLine qui doit foirer

Reply

Marsh Posté le 11-03-2005 à 14:29:20    

nraynaud a écrit :

y'a des gens qui justement conseillent de toujour écrire l'égalité à l'envers : "chaine".equals(variable)


c'est une solution de facilité, mais faut pas prendre ça comme habitude : souvent la valeur null a une signification spéciale.
 
D'ailleur c'est le cas, là. => dcvlm, vas voir dans la javadoc de BufferedReader.readLine(), tu verras que ce n'est pas anormal que ca renvoit null.


Message édité par benou le 11-03-2005 à 14:38:46

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 11-03-2005 à 14:29:31    

FlorentG : lu est :

String lu="";


 
Et mon lu est absolument pas vide, parce que :
 
1/si je demande pas le if pr le traitement et que je fais simplement  

out.println("<tr><td>"+lu+"</td></tr>" );


et bah ca marche tres bien
2/ Si je fais if(!lu.equals("new_topic" )), je ne rentre pas dans le if pour autant !
 
(rmq : ce sont des servlets, mais c'est presque trivial, non ??  :) )


Message édité par dcvlm le 11-03-2005 à 14:29:41

---------------
ZZZZzzzzz
Reply

Marsh Posté le 11-03-2005 à 14:34:21    

nraynaud président !
 
En effet, ca marche très bien dans l'autre sens !!!! :hello:


---------------
ZZZZzzzzz
Reply

Marsh Posté le 11-03-2005 à 14:36:25    

dcvlm a écrit :


En effet, ca marche très bien dans l'autre sens !!!! :hello:


t'as compris pkoi, au moins ?  :heink:  


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 11-03-2005 à 14:37:56    

lu.equals("new_topic" )
 
 
d'où la recommandation classique
 
-> "new_topic".equals(lu)
 
et c'est blindé

Reply

Marsh Posté le 11-03-2005 à 14:37:56   

Reply

Marsh Posté le 11-03-2005 à 14:39:05    

Taz a écrit :

et c'est blindé


je trouve qu'au contraire ca l'est pas ... en faisant ça tu fais 2 tests en un, mais y a souvent des cas où tu ne dois pas te comporter de la même façon dans les 2 cas.
 
J'ai déjà vu pas mal de bug à cause de se genre d'habitude => je conseille pas de systématiser ce genre d'écriture.


Message édité par benou le 11-03-2005 à 14:40:38

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 11-03-2005 à 14:43:03    

ben va le dire aux gens de Sun qui ont décidés de spécifier equals() comme ça. Et puis bon, si t'es capable de te souvenir qu'on compare les chaines avec .equals(), tu peux aussi te souvenir que si l'argument est null, ça fait faux.
 
Sinon tu deviens parano, et tu retrouves vie à écrire des
 
if(y == null) { return false; }
else { return x.equals(y); }
 
(c'est du déjà vu ça)

Reply

Marsh Posté le 11-03-2005 à 15:13:33    

benou>> Non je n'ai pas compris pourquoi !
Si j'avais à connaissance la subtilité dont tu parlres --> bah j'aurais pensé à l'écire dans l'autre sens   :heink:  
 
Sinon, j'ai une petite question : est-il possible de commencer à écrire au début d'un fichier plutot qu'a la fin ?
(soit c'est tout bete, soit je peux faire un nouveau topic si vous pensez que c'est nécessaire)..
Marci ! :hello:


Message édité par dcvlm le 11-03-2005 à 15:15:11

---------------
ZZZZzzzzz
Reply

Marsh Posté le 12-03-2005 à 10:02:28    

Salut, pour le equals j'ai fais un ptit test chez moi et ca marche très bien avec lu.equals("new_topic" ); ...
voila le code si t'as envi d'essayer par toi même
 

import java.io.BufferedReader;
import java.io.FileReader;
 
public class Coucou {
   public static void main(String args[]) {
      String lu="";
      try {
         BufferedReader in = new BufferedReader(new FileReader("coucou.txt" ));  
         while(in.ready()){
            lu = in.readLine();
            if(lu.equals("new_topic" )) System.out.println("yeah" );
         }
      }
      catch(java.io.FileNotFoundException e) {
         System.exit(1);
      }
      catch(java.io.IOException e) {
         System.exit(1);
      }
   }
}

Reply

Marsh Posté le 12-03-2005 à 10:08:14    

while(in.ready()){
            lu = in.readLine();
            if(lu.equals("new_topic" ))
 
 
dommage, c'est toujours pas, ça fera toujours une NullPointerException ...
 
 
while((s = in.readLine()) != null)
   c'est pourtant pas compliqué
 
il serait de RTFM un minimum :o
 

Reply

Marsh Posté le 12-03-2005 à 13:21:57    

et pourquoi ca ferait une exception ?
 
j'ai testé mon code et ça marche même avec un fichier vide
 
ce que tu as mis fonctionne aussi, mais pourquoi pas utiliser ready(), ca permet de savoir directement si le flux est prêt à etre lu
s'il renvoi faux c que le flux est fermé et donc que ya plus rien a lire... (fin de fichier)

Reply

Marsh Posté le 12-03-2005 à 13:23:20    

parce que in.readLine() peut toujours retourner null  ce que tu ne gères pas ...

Reply

Marsh Posté le 12-03-2005 à 14:31:35    

dans quel cas readLine() retournerait null ?  
 
si on arrive en fin de fichier, ready() retournera faux donc on entre pas dans la boucle while,
donc le readLine() ne s'effectuera pas
donc pas de NullPointerException


Message édité par jon301 le 12-03-2005 à 14:38:13
Reply

Marsh Posté le 12-03-2005 à 17:48:24    

jon301 a écrit :

dans quel cas readLine() retournerait null ?  
 
si on arrive en fin de fichier, ready() retournera faux donc on entre pas dans la boucle while,
donc le readLine() ne s'effectuera pas
donc pas de NullPointerException


ton assertion est un peu bancale ... autant te baser sur la valeur retournée par readLine(), là c'est sûr.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 12-03-2005 à 18:15:02    

je suis d'accord que la méthode de vérifier le retour de readLine() fonctionne
 
mais dans l'affaire, je veux juste dire qu'il existe la méthode ready(), qui a été créee exprès pour vérifier que ce genre de chose ne se produise pas
(vérification du flux entrant avant le readLine(), donc on aura jamais de NullPointerException)
 
 
enfin moi je ne fais qu'une suggestion, j'ai tester les 2 méthodes et   je sais très bien qu'elles marchent
c'est juste que je préfère faire ça avec les outils qui sont déjà à ma disposition
 
et puis il n'y a rien de bancale, tu n'auras qu'a faire tous les jeux d'essais possible par toi même, tu ne trouveras pas d'exception

Reply

Marsh Posté le 12-03-2005 à 18:16:32    

non ready() n'a pas été crée pour ce genre d'usage, justement.
 
Et justement tu pourras avoir des NullPointerException malgré le fait que ready() soit true.

Reply

Marsh Posté le 12-03-2005 à 18:18:56    

jon301 a écrit :


et puis il n'y a rien de bancale, tu n'auras qu'a faire tous les jeux d'essais possible par toi même, tu ne trouveras pas d'exception


y a rien à vérifier. la documentation dit que readLine() peut renvoyer null. et la documentation de ready() ne dit pas que ready() est vrai tant qu'on a pas atteint la fin de fichier, et non plus si un appel à readLine() ne reverra pas null.
 
j'invente rien, RTFM
http://java.sun.com/j2se/1.5.0/doc [...] eader.html

Reply

Marsh Posté le 12-03-2005 à 18:19:58    

ready() c'est juste pour savoir si le flux est immédiatement disposé à renvoyer quelque chose je crois ...en gros si son buffer n'est pas vide ...  
 
=> rien à vori avec un test valide sur la fin du fichier.
 
remarque quand même que contrarement à ce que dis taz, si ca retourne true, readLine retourne forcément autre chose que null, c'est plutot si ca retourne false que ca ne veut pas dire que readLine ne retournerait pas quelque chose de non null ...
 
en gros, là tu risques de ne pas lire la totalité de ton fichier.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 12-03-2005 à 18:21:13    

ok thx j'ai dla lecture  :(


Message édité par jon301 le 12-03-2005 à 18:21:51
Reply

Marsh Posté le 12-03-2005 à 18:21:45    

jon301 a écrit :

hmmmm
bon d'accord, et quand est ce que le readLine() retournerait null ?


jamais tu lis la doc ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 12-03-2005 à 18:23:57    

jon301 a écrit :

hmmmm
bon d'accord, et quand est ce que le readLine() retournerait null ?


jamais tu lis la doc ?
 
 
edit : il a édité :o

jon301 a écrit :

ok thx j'ai dla lecture  :(


c'est mieux :jap:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 12-03-2005 à 18:34:24    

Ok j'avais tord  :lol:  
 
readLine()
Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
 
 
mais c bizzare, dns mon code jvérifiais pas que le retour de readLine() soit != null, donc ca aurait du lever une exception quand j'atteignais la fin de fichier  :??:

Reply

Marsh Posté le 12-03-2005 à 19:39:56    

dcvlm a écrit :

benou>> Non je n'ai pas compris pourquoi !
Si j'avais à connaissance la subtilité dont tu parlres --> bah j'aurais pensé à l'écire dans l'autre sens   :heink:  
 


 
String monObjet;
 
 
monObjet.equals("toto" ) => tu prends 'monObjet', un objet null, vu que tu n'as jamais écris quoi que ce soit dedans, et tu veux appeler une méthode nommée equals()... bref tu fais une sorte de NULL.equals("toto" ), et on peut difficilement demander au vide d'appeler la méthode equals()
 
Conclusion : NullPointerException
 
 
 
"toto".equals(monObjet) => tu prends "toto", c'est un objet de type String et non null vu qu'il "contient" le mot 'toto', donc tu appeles la méthode equals() de façon propre, depuis un objet qui existe. Bref tu fais une sorte de "toto".equals(NULL).... Après cet appel tout beau tout propre, la méthode equals() voit qu'on veut comparer toto avec NULL, et la conclusion est 'false' car dans 'toto' ya des lettres et pas dans null
 
Conclusion : Le code marche
 
Danger : "toto".equals(monObjet) se comportera de la même façon avec un objet NULL car jamais instancié (ca peut arriver dans un code pas propre), ou avec une string vide (et là par contre cela peut être une comparaison volontaire, parfois on récupère ""  [:spamafote] )... on a le même comportement pour 2 choses différentes, ce n'est pas forcément une bonne chose


Message édité par Xavier_OM le 12-03-2005 à 19:42:50

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 12-03-2005 à 19:44:37    


non sense! phaique! bot!  :o  


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 12-03-2005 à 19:48:44    

schnapsmann a écrit :

non sense! phaique! bot!  :o


 
 :lol:  :D  tu écrirais quoi toi pour expliquer ca ? Que c'est un pointeur vers null ? Pas sur qu'il connaisse les pointeurs


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 12-03-2005 à 19:51:28    

Xavier_OM a écrit :

:lol:  :D  tu écrirais quoi toi pour expliquer ca ? Que c'est un pointeur vers null ? Pas sur qu'il connaisse les pointeurs


c'est une référence invalide sans instance derrière, c'est tout [:petrus75]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 12-03-2005 à 23:33:39    

schnapsmann a écrit :

c'est une référence invalide sans instance derrière, c'est tout [:petrus75]


tais toi, tôa :o
 
Xavier s'est fait chier à faire un gros post pour bien expliquer, alors respect :o
:jap:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 13-03-2005 à 23:54:53    

schnapsmann a écrit :

non sense! phaique! bot!  :o


tu rames ou quoi ? null peut être vu comme un singleton (à cause du ==) d'une classe qui hérite de toutes les classes et interfaces du système (et cette classe existe réellement en Eiffel par exemple) et qui déclenche une NPE pour toutes les méthodes qu'elle implémente.
 
Cette approche permet entre autre dans le traitement des types et des variables de ne pas avoir de singularités à cause de la valeur null.
 
 
Il est absolument essentiel d'essayer de faire ce type de généralités quand on développe.
 

benou a écrit :

tais toi, tôa :o
 
Xavier s'est fait chier à faire un gros post pour bien expliquer, alors respect :o
:jap:


il aurait pu ouvrir le débat en parlant de l'approche d'Eiffel et de C++ par exemple :o


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-03-2005 à 18:58:46    

nraynaud a écrit :

tu rames ou quoi ? null peut être vu comme un singleton (à cause du ==) d'une classe qui hérite de toutes les classes et interfaces du système (et cette classe existe réellement en Eiffel par exemple) et qui déclenche une NPE pour toutes les méthodes qu'elle implémente.
 
Cette approche permet entre autre dans le traitement des types et des variables de ne pas avoir de singularités à cause de la valeur null.
 
 
Il est absolument essentiel d'essayer de faire ce type de généralités quand on développe.
 
 
il aurait pu ouvrir le débat en parlant de l'approche d'Eiffel et de C++ par exemple :o


 
a toi l'honneur  :jap:  
 :D


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 16-03-2005 à 00:33:45    

tain mes les singularités, c'est pas sale bordel [:mlc](rien qu'à voir sur ce forum, y en a tout plein)


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 16-03-2005 à 00:46:17    

schnapsmann a écrit :

tain mes les singularités, c'est pas sale bordel [:mlc](rien qu'à voir sur ce forum, y en a tout plein)


http://www.refactoring.com/catalog [...] bject.html :p
 
(http://www.owlnet.rice.edu/~comp212/00-spring/handouts/week06/null_object_revisited.htm,  
http://martinfowler.com/eaaCatalog/specialCase.html)


Message édité par the real moins moins le 16-03-2005 à 00:51:08

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

Marsh Posté le 16-03-2005 à 08:35:58    

Je savais même pas que ça avait un nom ce pattern /o\
 


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 16-03-2005 à 08:52:47    

Donc voilà mon problème avec le split !!!
 

Code :
  1. String lu="";
  2.         out.println("<table>" );
  3.         while(lu!=null)
  4.         {
  5.          lu=in.readLine();
  6.          if("new_topic".equals(lu)){  out.println("<tr><td><hr></td></tr>" ); }
  7.          else
  8.          {
  9.             String[] result = lu.split("expression reg" );
  10.             for (int x=0; x<result.length; x++)
  11.             out.println("<tr><td>"+result[x]+"</td></tr>" ); 
  12.          }
  13.         }
  14.         out.println("</table>" );


 
Et pas de bol, ca me balance encore un npe !!!  :fou:  :fou:  
 
Et, meme fort de l'enrichissement précédent....je ne vois pas comment retourner mon

lu.split("expression reg" )

!!!
Ca doit être la "nature" de lu qui doit être bizarre (mais je vois asbolument pas pkoi !!!), parce que pour me rassurer je me suis essayé au split ailleurs qd ds le cas d'une lecture de fichier, et ca marchait très bien !  :(  
 
En attente de vos idées géniales :)


---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-03-2005 à 09:01:34    

Pourquoi est-ce que tu ne fais pas de debugging pour regarder exactement ce qui se passe?


---------------
Gestion de bug en mode ASP/java : http://eap.bug-sweeper.fr
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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