Problème avec DataInputStream.readLine() [Résolu]

Syd67 3 Messages postés lundi 4 octobre 2004Date d'inscription 12 août 2005 Dernière intervention - 12 août 2005 à 14:15 - Dernière réponse : Syd67 3 Messages postés lundi 4 octobre 2004Date d'inscription 12 août 2005 Dernière intervention
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Syd67 3 Messages postés lundi 4 octobre 2004Date d'inscription 12 août 2005 Dernière intervention - 12 août 2005 à 16:59
3
Merci
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

Merci Syd67 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 121 internautes ce mois-ci

Commenter la réponse de Syd67
Syd67 3 Messages postés lundi 4 octobre 2004Date d'inscription 12 août 2005 Dernière intervention - 12 août 2005 à 14:48
0
Merci
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
Commenter la réponse de Syd67

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.