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

Java Discussion :

Erreur "java.lang.InterruptedException" lorsque mon programme se ferme


Sujet :

Java

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut Erreur "java.lang.InterruptedException" lorsque mon programme se ferme
    bonjour,

    j'ai développé une application avec une interface utilisateur. Lorsque je quitte le programme (en appuyant sur un JButton), il arrive de temps en temps qu'une java.lang.InterruptedException soit déclenchée.

    Voici le message complet :
    Exception while removing reference: java.lang.InterruptedException
    java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at sun.java2d.Disposer.run(Disposer.java:145)
    at java.lang.Thread.run(Thread.java:722)

    Voici les événements que j'ai implémenté pour la fermeture de mon application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
         /**
         * Destruction des boites de dialogue lors de la fermeture de
         * l'application.
         * @param evt
         */
        private void formWindowClosed(WindowEvent evt)                                  
        {                                      
            jDialogRename.dispose();
            jDialogCopy.dispose();
            jDialogOptions.dispose();
            jDialogLiquid.dispose();
            jDialogIText.dispose();
        }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /**
         * Bouton Quitter.
         * @param evt
         */
        private void jBtnQuitActionPerformed(ActionEvent evt)                                         
        {                     
            jLblStatus.setText("Arrêt de l'application");
            jLblStatus.repaint();                        
               this.dispose();
        }
    Comme cette exception est déclenchée de manière non systématique je n'arrive pas à en trouver l'origine. Avez-vous une idée de ce qui la déclenche ? Il semblerait qu'un objet ne soit pas détruit au moment de la fermeture, mais lequel ?

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Points : 2 560
    Points
    2 560
    Par défaut
    Personnellement, je dirais que ce n'est pas tellement grave quand on voit la description de ta situation.
    Fais un catch(InteruptedException) {} pour ne pas tenir compte de cette exception. Fais cela si cela ne change pas la logique de fonctionnement de ton application.
    Cela se fait assez souvent de capturer cette exception et de ne rien faire pour elle
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Cela serait un bug du ramasse miette java ?

    Fais un catch(InteruptedException) {} pour ne pas tenir compte de cette exception.
    A quel niveau ? Lors du formWindowClosed ? A la fin de la fonction après tous les dispose() sur mes JDialog ?

  4. #4
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Points : 2 560
    Points
    2 560
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     private void jBtnQuitActionPerformed(ActionEvent evt)                                         
        {
           try {                     
            jLblStatus.setText("Arrêt de l'application");
            jLblStatus.repaint();                        
               this.dispose(); 
          } catch (InterruptedException e) {
             // Ne rien faire !
          }
        }
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par paissad Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     private void jBtnQuitActionPerformed(ActionEvent evt)                                         
        {
           try {                     
            jLblStatus.setText("Arrêt de l'application");
            jLblStatus.repaint();                        
               this.dispose(); 
          } catch (InterruptedException e) {
             // Ne rien faire !
          }
        }
    Dans ce cas l'appui sur le bouton risque de rien faire (pas de dispose de la JFrame principale) si une exception est levée, non ?

  6. #6
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Points : 2 560
    Points
    2 560
    Par défaut
    Le problème, c'est qu'on ne sait pas si c'est le repaint() ou le le dispose() qui crée une exception ...
    L'idéal serait qu'on ait le stacktrace complet.
    Essaie ceci sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     private void jBtnQuitActionPerformed(ActionEvent evt)                                         
        {
            jLblStatus.setText("Arrêt de l'application");
           try {                     
            jLblStatus.repaint();                        
          } catch (InterruptedException e) {
          }
          this.dispose(); 
        }
    Si cette fois-ci tu obtiens une InterruptedException, à cause du dispose() .. faudrait regarder ailleurs dans ton programme de manière générale
    PS: d'ailleurs, est ce que le "this" se réfère au JFrame principal ?
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par paissad Voir le message
    PS: d'ailleurs, est ce que le "this" se réfère au JFrame principal ?
    oui.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Cette exception est "normale", ce qui est anormal, c'est que le dispatch thread l'affiche :s Enfin bon. Tu n'a aucun controle dessus vu la stacktrace. Je note cependant

    1) les appels à dispose etc sont-ils bien fait au sein de l'event dispatch thread (edt)? Les instances liées à l'affichage ne sont pas supposées être modifiées à l'extérieur de l'edt
    2) Si tu quitte l'application, quel est l'intérêt de tous ces appels à dispose?? Fait un System.exit() tout simplement! Tu es occupé à faire des tonnes de nettoyage inutiles. C'est comme passer le balai dans toute la maison avant de la raser

  9. #9
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Cette exception est "normale", ce qui est anormal, c'est que le dispatch thread l'affiche :s Enfin bon. Tu n'a aucun controle dessus vu la stacktrace. Je note cependant

    1) les appels à dispose etc sont-ils bien fait au sein de l'event dispatch thread (edt)? Les instances liées à l'affichage ne sont pas supposées être modifiées à l'extérieur de l'edt
    euh... Comment savoir ? Le repaint serait en trop dans jBtnQuitActionPerformed ?

    Citation Envoyé par tchize_ Voir le message
    2) Si tu quitte l'application, quel est l'intérêt de tous ces appels à dispose?? Fait un System.exit() tout simplement! Tu es occupé à faire des tonnes de nettoyage inutiles. C'est comme passer le balai dans toute la maison avant de la raser
    je suis obligé de faire les dispose sur les JDialog sinon l'application bien qu'invisible est toujours présente dans les processus.

    J'ai toujours considéré (sans doute à tort ?) que le System.exit() était une méthode bourrin pour arrêter une application (on détruit tout sans se poser de question). Surtout que l'application utilise des threads, il faut bien que je les arrête proprement avant de tout quitter, non ?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je vois pas en quoi System.exit serait une méthode bourrin. Elle arrête le processus, et c'est ce que tu veux. La seule chose c'est qu'il faut faire un peu le ménage avant, notament avec tes fichiers ouvert si tu en as (s'assurer que tout a été bien écrit). A part ça, toutes les ressources (réseau, graphique, threads, fichiers) utilisées par ton application seront libérées lors du exit.

  11. #11
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par tchize
    Je vois pas en quoi System.exit serait une méthode bourrin. Elle arrête le processus, et c'est ce que tu veux. La seule chose c'est qu'il faut faire un peu le ménage avant, notamment avec tes fichiers ouvertd si tu en as (s'assurer que tout a été bien écrit). A part ça, toutes les ressources (réseau, graphique, threads, fichiers) utilisées par ton application seront libérées lors du exit.
    Donc il n'y aurait pas de différences entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void jBtnQuitActionPerformed(ActionEvent evt)                                         
    { 
        System.exit();
    }
    et ces deux fonctions :

    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
     
    private void formWindowClosed(WindowEvent evt)                                  
    {                                      
            jDialogRename.dispose();
            jDialogCopy.dispose();
            jDialogOptions.dispose();
            jDialogLiquid.dispose();
            jDialogIText.dispose();
    }
     
    private void jBtnQuitActionPerformed(ActionEvent evt)    
    {
            maConnexion.close();
            monThread.join();
     
            this.dispose();
    }

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si

    Dans le deuxième cas, si maConnexion déclenche un exception, on ne vire pas la fenetre et donc on n'arrête pas le programme. Vouloir tout nettoyer avec "comme effet de bord" l'arrêt du programme c'est bien moins propre, sans compter qu'on a plus le contrôle sur le code de retour du programme

  13. #13
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Si

    Dans le deuxième cas, si maConnexion déclenche un exception, on ne vire pas la fenetre et donc on n'arrête pas le programme. Vouloir tout nettoyer avec "comme effet de bord" l'arrêt du programme c'est bien moins propre, sans compter qu'on a plus le contrôle sur le code de retour du programme
    Excuse moi, je crois je ne t'ai pas compris (je ne suis pas un développeur java confirmé)

    System.exit(); est donc plus propre que de faire soi-même le nettoyage ? Et dans ce cas je peux remplacer mes deux fonctions par un System.exit(); ? Il faut juste que je vérifie si mes fichiers sont bien fermés ?

  14. #14
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Excuse moi, je crois je ne t'ai pas compris (je ne suis pas un développeur java confirmé)
    L'idée, c'est que dans la liste des appels qui sont fais avant this.dispose, si une exception est lancée, this.dispose ne sera pas executée et donc, tu seras arreté dans un état non prévu (avec eventuellement une partie de ton programme arretée et l'autre non). L'avantage du System.exit, c'est qu'il libere tout tout seul. Mais il faut quand meme faire attention à bien flusher les IO (par exemple les fichiers ou tout ce qui est caché).

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    LA seule chose que tu dois nettoyer toi même avant un system.exit, c'est tout ce qui concerne l'interaction avec le monde extérieur:
    -> s'assurer que t'a bien fini d'écrire dans tes fichier (pour éviter de corrompre tes fichiers)
    -> eventuellement, envoyer les codes de fermeture à tes clients sur socket (pour éviter qu'ils restent comme des cons à attendre des messages d'un programme qui n'existe plus)

  16. #16
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur exception java.lang.NullPointerException
    Par geol99 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2007, 20h24
  2. erreur de java.lang.NullPointerException
    Par vince351 dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2007, 12h29

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