Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec "finally"

code jamais exécuté

Sujet résolu
    13 décembre 2009 à 20:33:47

    Bonjour,

    J'ai un problème avec un bloc finally qui ne s'exécue jamais de chez jamais.
    Le contexte est celui d'un chat multithread client/serveur en java.
    C'est coté serveur que ca se passe, j'aimerai que lorsque l'on quitte coté client, le serveur exécute une action pour faire le nettoyage des sockets.
    J'ai donc mis cette action dans un finally du thread exécuté coté serveur (bien sur) pour géré la communication avec un client donné.
    Sauf que ce finally n'est jamais exécuté. Quel est le problème ?

    Je vous épargne le constructeur et les choses inutile. En dehors de ca mon programme marche...

    <position valeur="centre"><couleur nom="bleu">
    
    class Connexion extends Thread {
    
        public Socket c1;
        public Nettoyeur net;//nettoyeur (en sommeil, se réveille  quand recoit un message FIN de la part des users)
        public BufferedReader in;
        public PrintWriter out;
        public ArrayList<Connexion> ens;
        private String nom;
    
        @Override
        public void run() {
    
            StringBuffer s = new StringBuffer("Bienvenue!");
            out.println(s.toString());
            try {
                while (true) {
                    String message;
                    while ((message = in.readLine()) != null) {
                        send(message);
                    }
                }
            } catch (Exception e) {
            //System.out.println(e.getMessage());
            } finally {
                System.out.println("yapi yapo");
                try {
                    c1.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
    }
    
    </couleur></position>
    



    Une idée ? merci
    • Partager sur Facebook
    • Partager sur Twitter
      13 décembre 2009 à 21:17:16

      A cause de while(true) ?
      Tu ne sors jamais de ce bloc-ci, donc encore moins du bloc try.
      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2009 à 22:11:48

        À moins que send() ou readLine() lance une exception, je vois mal comment tu peux sortir du try!
        • Partager sur Facebook
        • Partager sur Twitter
          14 décembre 2009 à 12:41:53

          ah...
          donc comment je peux faire pour traiter correctement la déconnexion du client ?
          Je croyais que quoi qu'il arrivait on était amené à passer par la méthode finally ?
          Si ce n'est pas le cas, est-ce que je dois lancer une exception ? ou faire autrement ?
          • Partager sur Facebook
          • Partager sur Twitter
            14 décembre 2009 à 16:23:36

            Citation

            Je croyais que quoi qu'il arrivait on était amené à passer par la méthode finally ?


            Quoiqu'il arrive, quand on sort du bloc try...

            while(true) c'est très rarement une bonne idée.
            • Partager sur Facebook
            • Partager sur Twitter
              15 décembre 2009 à 21:37:57

              Faire un while(true) est très logique lorsque tu écoute une connexion, c'est le reste qui joue pas, il faudrait plutot faire ca, si tu tiens au finally
              while (true) {
                String message;
                message = in.readLine();
                if(message==null){//fin de la connexion
                  return; //va faire le finally
                }
                send(message);
                              
              }
              


              Encore une chose pourquoi tu fais un StringBuffer? Tu peux directement faire un out.println("Bienvenue!");
              Ca va aussi et c'est plus simple. Utiliser manuellement un StringBuffer ne sert que à faire de l'optimisation dans le cas de concatenation de String mais ici ca ne change rien.


              Une dernière chose n'abuse pas du finally ca peut rendre le code pas très compréhensible, en général quand on voit un return on ne s'attend pas à ce que du code soit exécuté en plus.
              • Partager sur Facebook
              • Partager sur Twitter
                23 décembre 2009 à 11:57:46

                merci pour ton aide, cela fonctionne.
                Pour le string buffer, c'est ce que j'avais dans mon cours, je l'ai donc utilisé, mais sans trop savoir on va dire.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  23 décembre 2009 à 12:04:00

                  Citation : Anarion9998


                  while (true) {
                    String message;
                    message = in.readLine();
                    if(message==null){//fin de la connexion
                      return; //va faire le finally
                    }
                    send(message);
                                  
                  }
                  



                  Je ferrais un break au lieu du return, comme ca on peut continuer au cas ou après le bloc try catch finally.
                  while (true) {
                    String message;
                    message = in.readLine();
                    if(message==null){//fin de la connexion
                      break; //va faire le finally
                    }
                    send(message);
                                  
                  }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème avec "finally"

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown