Problème avec DataInputStream.readLine()

Résolu
Syd67 Messages postés 3 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 12 août 2005 - 12 août 2005 à 14:15
Syd67 Messages postés 3 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 12 août 2005 - 12 août 2005 à 16:59
Bonjour à tous,

J'ai un petit problème qui me surprend un peu j'avouerai, mais peut etre que ca vient du fait que je ne maitrise pas forcément toutes les subtilités de Java en réseau... enfin bref, je m'explique :

Je dois créer un logiciel en Java qui permet des communications réseau par l'échange de String, donc bon ca c'est le principe global. Pour ce qui est des classes qui sont utilisées lorsque j'ai mon souci :

* la classe Client dont les champs importants ici sont un champ BarreDeMenu (nommé bdmMenu), un champ Socket (nommé soSocket) pour la communication réseau et un champ TraitementMessage

* la classe BarreDeMenu qui contient entre autres un champ GestionComptes (nommé gcGestionComptes), un champ String sMessage (créé pour le débug de mon problème) indiquant si le champ GestionComptes a bien été créé (différent de "null") par le message suivant : "gcGestionComptes créé" ou "gcGestionComptes non créé"

La classe TraitementMessage sert à définir quelle classe doit gérer le message reçu du serveur, donc on lui passe un objet String représentant le message (nommé sMessageATraiter) et apres elle transmet le message à la classe qui doit gérer le message. Ici le message qui est reçu doit être géré par la classe GestionComptes. Elle contient donc un champ GestionComptes (nommé gcGestionComptes) qui est défini dans le constructeur, à partir d'un objet BarreDeMenu (nommé bdmMenu) passé en paramètre du constructeur.

Après ces petites explications nécessaires a mon avis, voila le problème en soi :

(les lignes de code qui sont contenues dans la classe courante où a lieu le problème.. : )

Code :

A ce stade, le champ sMessage d'un objet BarreDeMenu contient "gcGestionComptes créé" et le champ GestionComptes est bien défini...

// Création du flux d'entrée
DataInputStream disFlux = new DataInputStream(clClient.soSocket.getInputStream());

// Déclaration de la ligne reçue
String s_ligne;
// Affichages 1 pour mon débuggage
System.out.println(clClient.getBarreDeMenu().sMessage);
System.out.println("gcGestionComptes null : ");
System.out.println(clClient.getBarreDeMenu().getGestionComptes() == null);

// Création d'une barre de menu temporaire
BarreDeMenu bdm_barre_temporaire;
bdm_barre_temporaire = clClient.getBarreDeMenu();

// Affichages 2 pour le débuggage
System.out.println(bdm_barre_temporaire.sMessage);
System.out.println("gcGestionComptes null : ");
System.out.println(bdm_barre_temporaire.getGestionComptes() == null);

// Ligne qui fout la m****
s_ligne = disFlux.readLine();

// Affichages 3 pour mon débuggage
System.out.println(clClient.getBarreDeMenu().sMessage);
System.out.println("gcGestionComptes null : ");
System.out.println(clClient.getBarreDeMenu().getGestionComptes() == null);
System.out.println(bdm_barre_temporaire.sMessage);
System.out.println("gcGestionComptes null : ");
System.out.println(bdm_barre_temporaire.getGestionComptes() == null);

Donc en gros, j'ai l'impression que ma ligne s_ligne = disFlux.readLine() me remet tout a zéro...
Les affichages 1 donnent lieu aux affichages suivants :

"gcGestionComptes créé"
"gcGestionComptes null"
false

Les affichages 2 donnent ça :

"gcGestionComptes créé"
"gcGestionComptes null"
false

Les affichages 3 donnent :

"gcGestionComptes non créé"
"gcGestionComptes null"
true

"gcGestionComptes non créé"
"gcGestionComptes null"
true

J'ai identifié le fait que le problème vient de la ligne qui fout la m**** étant donné qu'en la déplaçant, les affichages changent... au niveau de la fonction, les objets semblent être réinitialisés... ce qui me parait très bizarre en fait... pourtant, l'objet bdm_barre_temporaire n'a aucun lien direct avec la fonction readLine(), donc je comprends pas pourquoi ses valeurs en sont changées... ca m'aiderait assez que les valeurs ne soient pas réinitialisées, car après avoir stocké le message reçu dans s_ligne, j'aimerai lancer un objet TraitementMessages en lui passant en paramètre au constructeur un objet BarreDeMenu contenant un champ GestionComptes qui existe....... en effet, lorsque j'exécute mon truc, il me met un JavaNullPointerException dans le traitement du message car du fait de la réinitialisation par readLine(), l'objet GestionComptes n'existe plus dans les barres de menu utilisées.................. voila je comprends pas !!!

Si qqn pouvait m'aider, ca serait sympa

Merci d'avoir lu entièrement le message en tout cas, c'est dejà gentil :p

A+++

Syd

2 réponses

Syd67 Messages postés 3 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 12 août 2005
12 août 2005 à 16:59
Bon en fait, j'ai résolu le problème, en faisant des modifications qui ne concernaient pas la partie réseau de mon projet.....

En fait, ce n'était pas le bon objet BarreDeMenu qui était chargé, au moment où les affichages changeaient, donc j'ai fait en sorte de choisir le bon objet BarreDeMenu, et non pas un nouveau (où forcément le champ gcGestionComptes n'était pas encore renseigné).

Voila, donc ben désolé d'avoir fait perdre du temps à ceux qui ont lu le message :) lol

Bonne continuation au site, et a+ (en espérant que je n'aurai pas de problèmes prochainement.. :) )
Syd
3
Syd67 Messages postés 3 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 12 août 2005
12 août 2005 à 14:48
Bon j'ai modifié le code pour utiliser plutot BufferedReader.readLine() mais le problème de réinitialisation persiste... je comprends pas trop..

Merci et a+
Syd
0
Rejoignez-nous