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

Langage Java Discussion :

Un blocage sans erreur


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Un blocage sans erreur
    Bonjour à tous !

    Je suis face à un problème curieux.
    J'ai deux classes : Interface et Assistant.
    La classe Interface crée une instance unique de la classe Assistant (singleton) et l'affiche dans un JDialog :

    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
    private static Interface i;
    private static Assistant a;
     
    private Interface extends JFrame {
        //...
        dial = new JDialog(this, "titre", true);
        dial.add(getInstanceAssistant());
        //...
    }
     
    public synchronized static Assistant getInstanceAssistant() {
        if (a == null) {
            a = new Assistant();
        }
        return a;
    }
     
    public synchronized static Interface getInstanceInterface() {
        if (i == null) {
            i = new Interface();
        }
        return i;
    }
    Tout fonctionne bien jusque là, l'assistant se lance et je peux y naviguer, mais lorsque je clique sur un bouton qui est censé masquer l'assistant et créer un objet d'une autre classe, tout se bloque, il n'y a pas d'erreur, mais le bouton reste enfoncé sans produire la moindre action.

    J'ai mis quelques points de tests dans le code source de la méthode appelée lors du clic sur le bouton (dans la classe Assistant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void btnMouseReleased(java.awt.event.MouseEvent evt) {
        //...
        System.out.println("test1");
        Interface i = Interface.getInstanceInterface();
        System.out.println("test2");
        i.meth();
    }
    Il se trouve que seul "test1" s'affiche dans la console de NetBeans... Voici à tout hasard la méthode meth() dans la classe Interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void meth() {
        a.setVisible(false);
        //...
    }
    D'où peut bien venir ce problème ? Pourquoi ne puis-je pas récupérer l'unique instance de Interface dans la classe Assistant ?

    Merci d'avance !
    Axel
    Dernière modification par Invité ; 06/10/2008 à 19h13.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Déjà tu t'es fait "chier" pour indenter/colorier ton code !
    La balise [code] (bouton ) le fait très bien


    Pour ton problème, je pencherais sur un dead-lock... mais il faudrait voir le code des constructeurs d'Assistant et d'Interface...


    Enfin tu pourrais complètement te passer de synchronisation via l'initialisation en ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private static final Assistant a = new Assistant();
     
     
    public static Assistant getInstanceAssistant() {
        return a;
     
    }
    a++

    PS : i et a ne sont pas très adapté pour des noms de variables statiques
    Cela ne devrait être utilisé que pour des variables locales temporaires...

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    PS : i et a ne sont pas très adapté pour des noms de variables statiques
    Cela ne devrait être utilisé que pour des variables locales temporaires...
    Dans la même veine, appeller sa classe Interface, c'est assez limite.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Faiche Voir le message
    Dans la même veine, appeller sa classe Interface, c'est assez limite.
    Tu veux dire l'appeler depuis une autre classe alors que c'est la classe principale ? Dans ce cas il faudrait que je regroupe les classes Interface et Assistant ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par axel41 Voir le message
    Tu veux dire l'appeler depuis une autre classe alors que c'est la classe principale ? Dans ce cas il faudrait que je regroupe les classes Interface et Assistant ?
    Non, je veux dire que nommer une classe Interface, sachant que interface (minuscule) est un mot clé, c'est casse gueule.

    ça ne provoquera pas d'erreur, car c'est techniquement autorisé, mais ça peut preter à confusion, et c'est important de nommer clairement ses objets/variables.

    Je suis tombé un jour sur un projet qui comportait une grosse hiérarchie de classe (facile 5 héritages successifs) où la classe mère possedait un attribut nommé i, et qui, suivant la classe fille, et suivant le développeur, ne servait pas à la même chose (véridique).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Faiche Voir le message
    Non, je veux dire que nommer une classe Interface, sachant que interface (minuscule) est un mot clé, c'est casse gueule.
    Ah oui effectivement, j'avais pas pensé à ça. En plus je fais ça dans tous mes prog !
    Merci pour l'info

  7. #7
    Invité
    Invité(e)
    Par défaut
    D'après ce que j'ai pu lire sur les dead-lock, c'est pas bon signe...

    Voici une copie simplifiée du code des classes Interface et Assistant (effectivement, avec les balises "code" c'est plus simple ) :

    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
    public class Interface extends JFrame {
     
        public static void main(String[] args) {
        }    
     
        private static final Interface INSTANCE_INTERFACE = new Interface();
     
        private JDialog dial;
     
        private Interface() {
     
            setTitle("titre");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
     
            dial = new JDialog(this, "titre assitant", true);
            dial.add(Assistant.getInstanceAssistant());
            dial.pack();
            dial.setLocationRelativeTo(null);
     
            pack();
            setVisible(true);
            dial.setVisible(true);
     
     
        }
     
        public synchronized static Interface getInstanceInterface() {
            return INSTANCE_INTERFACE;
        }
     
        public void meth() {
            //Code... non appelé de toute façon.
        }
     
    }
    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
    public class Assistant extends JPanel {
     
        private static final Assistant INSTANCE_ASSISTANT = new Assistant();
     
        public Assistant() {
            //création de l'interface
            initComponents();
        }
     
        public static Assistant getInstanceAssistant() {
            return INSTANCE_ASSISTANT;
        }                             
     
        private void btnNouvMouseReleased(java.awt.event.MouseEvent evt) {
            System.out.println("test1");
            Interface i = Interface.getInstanceInterface();
            System.out.println("test2");
            i.meth();
        }                                     
     
    }
    Dernière modification par Invité ; 06/10/2008 à 19h14.

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Dans la méthode "btnMouseReleased", il faut utiliser this, et non "Interface.getInstanceInterface()".
    De plus, la méthode d'accès au singleton "Assistant" doit se trouver dans la classe "Assistant".

    EDIT : trop lent
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci
    Je vais faire les quelques modifs que vous me conseillez et je vous tiens au courant.
    Par contre j'ai pas compris pourquoi il faut que je mette this dans la méthode "btnMouseReleased".

  10. #10
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par axel41 Voir le message
    Merci
    Je vais faire les quelques modifs que vous me conseillez et je vous tiens au courant.
    Par contre j'ai pas compris pourquoi il faut que je mette this dans la méthode "btnMouseReleased".
    "btnMouseReleased" est une méthode de la classe Interface ?
    Si oui, alors encore plus simple : appelle directement la méthode "meth()".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

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

Discussions similaires

  1. lien <a href> sans erreur
    Par loady dans le forum Langage
    Réponses: 3
    Dernier message: 12/07/2006, 01h14
  2. [Upload] pb upload fichier sans erreur
    Par guns17 dans le forum Langage
    Réponses: 2
    Dernier message: 06/06/2006, 15h30
  3. comment faire un group by sans erreur
    Par phpaide dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 10h11
  4. Restaurer ma Base sans Erreur???
    Par touhami dans le forum Connexion aux bases de données
    Réponses: 9
    Dernier message: 08/03/2006, 18h04
  5. REquete sans erreur sql qui n'agit pas ........
    Par Skam dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/02/2005, 14h41

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