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 :

[Thread] Erreur dans une classe interne


Sujet :

Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [Thread] Erreur dans une classe interne
    java.lang.NullPointerException
    at monPackage.maClass.access$000(maClass.java:37)

    La ligne 37 correspond à la ligne de déclaration de ma classe
    qui est une classe abstraite qui contient une inner class.

    Que peut bien vouloir dire cette erreur ?



    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Fais voir ton code...

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Le code est très compliqué, il fait parti d'un framework.

    C'est une classe abstraite intégrant une inner class abstraite. L'inner
    classe permet de lancer des threads sur une méthode action qui doit
    être définie.

    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
    public abstract class XEdPage extends XPage {
     
      public abstract boolean isEdPage();
     
      public abstract Class beanClass();
     
      protected Page create()
        throws Exception {
        ActionThread createThread = new ActionThread(this, "Create") {
            protected void action() {
               ...
            }
        }.waitAndCheck();
     
      public abstract class ActionThread implements Runnable {
     
        protected ActionThread(XEdPage parent, String operation) {
          this.parent = parent;
          this.operation = operation;
          new Thread(this).start();
        }
     
        public Page waitAndCheck() {
            ...
        }
     
        protected abstract void action() throws Exception;
     
        protected abstract Page success() throws Exception;
      }
    }
    Le problème se produit de temps en temps lorsqu'une classe héritant de
    celle-ci essaie d'accéder à la méthode create. Ce projet fonctionne sous
    weblogic et également sous tomcat. L'erreur ne se produit jamais avec
    tomcat.

    Je pencherais vers un problème de thread, un objet essaie d'accéder à
    une méthode d'une classe inner alors qu'il n'est pas encore entièrement
    construit ???

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Salut,

    Bon, il semblerait que tu veuilles créer une instance d'une classe abstraite... Et JAVA ne le veut (et ne le peut) pas (et c'est normal!).

    ActionThread : une classe déclarée comme abstract -> new ActionThread(...) impossible.

    Soit tu crées une autre classe implémentant les méthodes manquantes et c'est celle-ci que tu instancies, soit tu ne déclares pas ActionThread comme abstract.

    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
    public class ActionThread implements Runnable {
      protected ActionThread(XEdPage parent, String operation) { 
        this.parent = parent; 
        this.operation = operation; 
        new Thread(this).start(); 
      }
     
      public Page waitAndCheck() { 
        ... 
      } 
     
      protected void action() throws Exception { 
        ... 
      } 
     
     
      protected Page success() throws Exception { 
        ... 
      } 
    }
    Cela t'obliges à implémenter action() et success()...

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Java ne permet pas d'instancier une classe abstraite, certe, mais le
    code est fait de la manière suivante.

    La méthode create de la classe mère crée une instance de la classe
    abstraite ActionThread en implémentant les deux méthodes action et
    success.

    Et ça marche dans 98% des cas. Seulement, de temps en temps, ça
    plante avec le message d'erreur précité ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    protected Page create() 
    throws Exception { 
    ActionThread createThread = new ActionThread(this, "Create") { 
       protected void action() { 
          ... 
       } 
     
       protected Page success() {
          ...
       }
    }.waitAndCheck();

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    J'ai trouvé mon problème, aussi le fais-je partager à la communauté...

    Revoici le code simpifié pour l'explication :
    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
    42
     
    public abstract class XEdPage extends XPage { 
      protected boolean maVariable;
     
      public maMethode() {
      }
     
      public abstract boolean isEdPage(); 
     
      public abstract Class beanClass(); 
     
      protected Page create() throws Exception { 
        ActionThread createThread = new ActionThread(this, "Create") { 
          protected void action() throws Exception { 
            maMethode();
            maVariable = true;
          } 
        }.waitAndCheck();
     
        protected Page success() throws Exception {
        }
      }
     
      public abstract class ActionThread implements Runnable { 
       public XEdPage parent;
       public String operation;
     
       protected ActionThread(XEdPage parent, String operation) { 
          this.parent = parent; 
          this.operation = operation; 
          new Thread(this).start(); 
        } 
     
        public Page waitAndCheck() { 
          ... 
        } 
     
        protected abstract void action() throws Exception; 
     
        protected abstract Page success() throws Exception; 
      }  // fin inner class ActionThread
    }


    J'ai donc un objet qui dérive de XEdPage qui appelle la méthode create.
    Cette méthode crée un objet ActionThread en déclinant les méthodes
    action et success. Et le constructeur de ActionThread démarre le thread.
    Tout ceci fonctionne sous Weblogic 6 SP4 (java 1.3).
    Seulement voilà, de temps en temps, l'erreur java.null avec access$000
    se produit à la ligne d'appel de la méthode maMethode. J'ai donc passé cette méhode en static pour voir, et là, oh miracle, le problème se produit sur la ligne suivante !!! Il y a donc un problème d'accès dans la méthode
    action au paramètre de la classe mère de temps en temps ? Comme cette classe mère est passé en paramètre à la méthode ActionThread 'new ActionThread(this, "Create")', j'ai donc modifié le code pour accéder aux méthode de XEdPage en utilisant : parent.maMethode et parent.maVariable. Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      protected Page create() throws Exception { 
        ActionThread createThread = new ActionThread(this, "Create") { 
          protected void action() throws Exception { 
            parent.maMethode();
            parent.maVariable = true;
          } 
        }.waitAndCheck();
     
        protected Page success() throws Exception {
        }
      }
    Et mon problème ne se reproduit plus.

    Je n'ai pas toute l'explication du pourquoi ça plante de temps en temps, si ce n'est un problème de thread !

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

Discussions similaires

  1. Redéfinir un constructeur dans une classe interne anonyme
    Par pigpen dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 31/10/2011, 13h36
  2. Erreur dans une classe de file
    Par napi15 dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2010, 11h39
  3. Erreur dans une classe !
    Par perdos dans le forum C#
    Réponses: 6
    Dernier message: 16/08/2007, 13h03
  4. Gestion des erreurs dans une classe
    Par gregb34 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 26/07/2007, 09h59
  5. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45

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