IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Exception dans un thread puis NullException


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut Exception dans un thread puis NullException
    Bonjour

    J'ai codé une application client/serveur qui marchait très bien sur plein de PC différents depuis 2 semaines sans aucune erreur. Aujourd'hui, je démarre le programme et il marche mais avec des exceptions !

    Ce qui se passe c'est :
    le client envoie une chaine au serveur. Pas de problème.
    Mais ensuite, j'ai une exception qui dit :
    Exception in thread-4
    puis le dialogue client/serveur continue normalement sans aucun problème. Arrivé au bout de la discussion apparait une NullPointerException.
    Les deux exceptions sont côtés client uniquement.

    Je vous explique rapidement le modèle du code. La classe Gui (interface graphique) lance un thread de la classe Partie. Partie appelle Communication qui lance un nouveau thread d'écoute. Voici la méthode qui écoute le serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public void waitFromServer()
    {
        	String msg = "" ;
     
        	// tant qu'on recoit pas LOOSER
        	do
        	{
                try{
                	boolean stop = false ;
                	// recevoir tant qu'on recoit pas OK
    	            while(stop == false)
    	            {
     
    	            	msg = fromServer.readLine();
    	            	// on arrete si on recoit OK ou KO
    	            	if(msg.equals("KO") || msg.equals("OK"))
    	            	{
    	            		System.out.println("<-"+msg);
    	            		stop = true ;
    	            	}
    	            	// sinon on lit les donnees
    	            	else if(msg.equals("TURN"))
    	            	{
    	            		System.out.println("<-"+msg);
    	            		sendData("PLAY TREAT");
    	            	}
    	            	else 
    	            	{
    	            		System.out.println("<-"+msg);
    	            	}
     
    	            }                             
     
                }catch(IOException ioe){ System.out.println("Error reading from server"); }
     
        	}while(!msg.equals("LOOSER") && !msg.equals("QUIT"));
        	try{
        		clientSock.close();
        	}catch(IOException io){ System.out.println("Error closing socket"); } 
    }
    Peu importe la signification des messages ...
    Donc le client affiche l'exception sur le thread-4 puis reçoit le "OK" du serveur et ça continue normalement avec la réception des autres chaines de la part du serveur après l'envoi du client! Et à la fin, quand le serveur envoie "QUIT", la NullException apparait sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(msg.equals("KO") || msg.equals("OK"))
    C'est très étrange, je n'ai rien touché ... Voyez-vous quelque chose de bizarre ? En plus, côté serveur, y'a aucun problème...

    EDIT : J'ai rajouté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(msg == null)
    	      System.out.println("msg est null");
    juste après le readLine() et bien le client reçoit la dernière ligne qui est "QUIT" et pourtant, il m'affiche "msg est null". Si msg = null, comment le client a-t-il pu dans ce cas afficher "QUIT" qui est justement contenu dans msg ....
    Il affiche d'abord "QUIT" puis "msg est null". Ca veut dire que le fait de recevoir "QUIT" n'a pas arrêté la boucle et pourtant, ce n'est pas logique... Ca devrait l'arrêter et pas repartir pour un tour ...

    Edit2 : je ne sais pas si on peut appeler ça résoudre le problème mais si je rajoute un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch (NullPointerException np) { np.toString() ; }
    à la fin du code, je n'ai plus d'exception et le code tourne... Mais n'est-ce pas masquer le problème que de faire ainsi ?

    Nas'

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je ne peux pas expliquer pourquoi l'erreur se produit ponctuellement.

    Deux choses, peut être, pourront t'aider.

    A la suite d'un NullPointerException, l'exécution sort complètement de ta boucle. Il est impensable qu'ensuite elle affiche QUIT ou qu'elle reçoive QUIT ou je ne sais quoi. Il doit s'agir d'un autre phénomène. Peut être affiche-t-elle QUIT avant le NullPointerException ?

    Si tu veux te protéger facilement des NullPointerException sur les equals de chaînes, tu peux écrire "OK".equals(msg) au lieu de msg.equals("OK") ; il faudra tout de même gérer quelque part le cas où msg est à null.

  3. #3
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Merci pour ta réponse.

    Oui, le "QUIT" s'affiche avant la NullPointerException. D'ailleurs, comme je l'ai indiqué, j'ai une erreur "Exception in thread-4" juste avant la réception du premier message de la part du serveur et à la fin seulement apparait la NullPointerException sur la comparaison.
    Donc en fait, ce que j'ai fait pour "résoudre" le problème c'est que j'ai rajouté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if( msg != null )
    // et là je fais les tests et tout ..
    Mais c'est incompréhensible pour moi ! La méthode readLine() est supposée bloquante donc si elle "passe", msg ne peut pas être null si le serveur envoie quelque chose de valide...
    Puis surtout que le problème apparait après 2 semaines d'utilisation sans problème.... (sur plusieurs machines, différents OS...).

    Dans quelle circonstance "msg" peut être "null" ?

    Nas'

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Ben tout simplement à la fin du flux. C'est le fonctionnement normal. Voir javadoc :
    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

Discussions similaires

  1. Gérer les exceptions dans un thread
    Par Pynouz dans le forum C#
    Réponses: 5
    Dernier message: 06/10/2011, 12h29
  2. Exception dans un thread
    Par narutoe dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 18/07/2011, 23h31
  3. Récupération d'une exception dérivée dans un thread
    Par Baccs dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 22/08/2008, 15h55
  4. Réponses: 4
    Dernier message: 22/04/2008, 18h29
  5. [C#] Exception dans un thread
    Par padodanle51 dans le forum C#
    Réponses: 3
    Dernier message: 02/07/2007, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo