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 :

InstantiationException lancée par l'instruction newInstance()


Sujet :

Java

  1. #1
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut InstantiationException lancée par l'instruction newInstance()
    Bonjour,

    J'ai des classes concrètes qui héritent d'une même classe abstract. Comme le programme récupère le nom de ces classes dynamiquement (dans un fichier xml), je ne peux faire de "new MaClasse(...);". Je passe donc par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName(nomDeClasseConcrete).newInstance()
    .
    Cependant l'exception java.lang.InstantiationException est lancée. Or d'après la javadoc, ce problème est dû à la tentative d'instancier une classe abstract ou une interface.
    Pourtant même si elles héritent d'une classe abstract, mes classes à instancier sont bien concrètes.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public abstract class Action {
     
    	private Model model;
    	public Action(Model model) { this.model = model; }
    	public abstract String getName();
    	public abstract Object executer();
    }
    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
    //La classe concrète
     
    public class Fax extends Action{
     
     
     
    	public Fax(Model model){
     
    		super(model);
    	}
     
    	public String getIntitule() {
     
    		return getClass().getName();
    	}
     
    	public Object executer(){
     
    		return null;
     
    	}
     
     
    	public String getName() {
     
    		return getClass().getName();
    	}
     
     
     
    }
    Quelqu'un connait la cause?

    Grâce à la recherche, j'ai vu qu'une autre personne de ce forum avec eu ce problème et puis l'avait résolu mais sans savoir comment...

    Je vous remercie.

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour,
    ça vient tout simplement du fait que tes classes concrètent que tu essaies d'instancier n'on pas de constructeur pas défaut (leur constructeur prend plutôt un Model comme paramètre), et donc, newInstance qui invoque le constructeur par défaut echoue.

    Deux solutions:
    1. Soit tu refais la conception pour que toutes tes classes définissent un constructeur par défaut.
    2. Soit tu passes plutôt comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class.forName(nomDeClasseConcrete).getConstructor(Model.class).newInstance(model);

  3. #3
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Merci de ta réponse, j'ai fait un contructeur sans argument dans la classe abstract Action et dans les classes concrètes qui en héritent, et newInstance() fonctionne.
    Cependant je m'intéresse au code que tu as proposé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName(nomDeClasseConcrete).getConstructor(Model.class).newInstance(model);(1)
    Imaginons qu'un jour, j'ai absolument besoin de passer des arguments en paramètre au constructeur de la classe suivante:
    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
     
    //La classe Action serait exactement comme celle de mon précédent post
    public class Fax extends Action{
     
    	private A a;
     
            public Fax(Model model, A a){
     
    		super(model);
                    this.a = a;
    	}
     
    	public Object executer(){
     
    		return null;
     
    	}
     
     
    	public String getName() {
     
    		return getClass().getName();
    	}
     
     
     
    }
    D'après (1) tu appelles le constructeur de la classe ClasseConcrete en lui passant comme paramètre un model. Mais s'il y a un paramètre a de type A de plus à passer (comme pour la classe Fax), comment ferait-on pour adapter (1)?

    Merci beaucoup

  4. #4
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    La méthode getConstructor étant à ellipse, tu peux lui passer un nombre quelconque d'arguments.

    Donc ça donnerait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class.forName(nomDeClasseConcrete).getConstructor(Model.class, String.class, ArrayList.class, Date.class).newInstance(model);
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Ou plus précisement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Class[] pclass = {Model.class.getClass(), A.class.getClass()};
    Class.forName(nomDeClasseConcrete).getConstructor(pclass).newInstance(model,  toninstancedeA);

  6. #6
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Merci à vous trois pour vos réponses.
    J'ai testé la méthode de gifffftane et celle de ep31, elles marchent toutes les deux. Sauf que pour la dernière, il faudrait juste enlever les getClass().

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

Discussions similaires

  1. Transmettre des commandes à un process lancé par ksh
    Par jojolepabo dans le forum Linux
    Réponses: 3
    Dernier message: 19/10/2005, 16h05
  2. [Runtime] Detruire un process lancé par exec()
    Par Sebounet19 dans le forum API standards et tierces
    Réponses: 13
    Dernier message: 04/10/2005, 09h17
  3. Réponses: 5
    Dernier message: 11/03/2005, 16h48
  4. Réponses: 10
    Dernier message: 08/02/2005, 16h04
  5. [Débutant(e)] Ou trouver la commande lancée par eclipse
    Par Emdis dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/11/2004, 11h00

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