No enclosing instance of type is accessible [Résolu/Fermé]

Signaler
-
 domxaline -
Bonjour,
en compilant mon prg,j'ai eu cette erreur, veuillez m'aidez svp:

"No enclosing instance of type Personnage is accessible. Must qualify the allocation with an enclosing instance of type Personnage
(e.g. x.new A() where x is an instance of Personnage)."

public abstract class Personnage 
{
 public void seDeplacer()
 {
  System.out.println("Je me déplace à pied.");
 }
 
 public  void combattre()
 {
  System.out.println("Je ne combat pas!");
 } 
 public class Guerrier extends Personnage
 {
  public void combattre()
  {
   System.out.println("Fusil,Pistolet,Couteau! Tous ce que tu veux!");
  }
  
 } 
 public class Medecin extends Personnage
 {
  public void combattre()
  {
   System.out.println("Vive le scalpel!");
  }
  
  public void soigner()
  {
   System.out.println("Je soigne les blessures.");
  }
 } 
 public class Civil extends Personnage
 {
  public void combattre()
  {
   System.out.println("Je ne combat pas!");
  }
  public void seDeplacer()
  {
   System.out.println("Je me déplace à pied.");
  }
 } 
 public class Chirurgien extends Personnage
 {
  public void combattre()
  {
   System.out.println("Je ne combat pas!");
  }
  public void seDeplacer()
  {
   System.out.println("Je me déplace à pied.");
  }
  public void soigner()
  {
   System.out.println("Je fais des opérations.");
  }
 } 
 public class Sniper extends Personnage
 {
  public void combattre()
  {
   System.out.println("Je me sers de mon fusil à lunette!");
  }
  public void seDeplacer()
  {
   System.out.println("Je me déplace à pied.");
  }
 } 
 public static void main(String[]args)
 {
  Personnage[]tPers=
  {new Guerrier(),new Chirurgien(),new Civil(),new Sniper(), new Medecin()};
  for(Personnage p:tPers)
  {
   System.out.println("\nInstance de "+p.getClass().getName());
   System.out.println("******************************************************");
   p.combattre();
   p.seDeplacer();
  }
 } 
}

9 réponses

Messages postés
16251
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2021
2 797
Le problème c'est que tu as fait

public class A
{
     public class B
     {
     }
}

B b = new B();

Or cela n'est pas possible, car les objets de B doivent dépendre des objets de A.

Il faudrait faire :

A a = new A();
B b = a.new B();

Or dans ton cas c'est impossible car A est une classe abstraite ! Il faudrait donc utiliser une implémentation de A, mais les seules implémentations que tu as c'est B...

Première solution, tu considères que la classe B est static, elle ne dépend donc plus des objets de A mais de la classe, il n'est donc plus nécessaire d'instancier un objet A.

public class A
{
     public static class B
     {
     }
}

A.B b = new A.B();

Deuxième solution, qui est à mon avis la meilleure dans ton cas, tu ne fais pas de classes internes, mais tu mets chaque classe dans son propre fichier.

public class A
{
}

public class B
{
}

B b = new B();
6
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
75
Bonsoir,

Je ne sais pas si j'ai bien saisie le problème, mais apparemment, tes classes concrètes (Chirurgien, Médecin...) sont des classes internes de la classe principale.

en général, si ta classe principale n'était abstraite, la méthode correcte d'instancier des objets des classes internes est la suivante:
ClassePrincipale cp= new ClassePrincipale();
ClasseInterne ci= cp.new ClasseInterne();


et puisque ta classe principale est abstract alors voila le remède:

Personnage per = new Personnage()
 {
 };
 Personnage[] tPers = { per.new Guerrier(), per.new Chirurgien(), per.new Civil(), per.new Sniper(), per.new Medecin() };


j'ai pas encore trouvé le texte qui explique directement cette méthode, peut etre kil faut chercher dans des livres qui traitent en détail les classes internes.

Bonne chance

NB: si vous déclariez tes classes hors la classe principale Personnage, le problème disparaitra.

Being normal is boring... being geek is interesting
vous voulez que je fasse ainsi,
public static void main(String[] args) 
  {
   /*Personnage[] tPers = {new Guerrier(), new Chirurgien(),
   new Civil(), new Sniper(), new Medecin()};*/
   Personnage per = new Personnage()
    {
    };
    Personnage[] tPers = { per.new Guerrier(), per.new Chirurgien(), per.new Civil(), per.new Sniper(), per.new Medecin() };
   for(Personnage p : tPers)
   {
   System.out.println("\nInstance de " + p.getClass().getName());
   System.out.println("***************************************");
   p.combattre();
   p.seDeplacer();
   }


en faisant ça ,j'ai erreur suivante:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Personnage.Guerrier cannot be resolved to a type
Personnage.Chirurgien cannot be resolved to a type
Personnage.Civil cannot be resolved to a type
Personnage.Sniper cannot be resolved to a type
Personnage.Medecin cannot be resolved to a type

at Personnage1.main(Personnage1.java:60)
Messages postés
16251
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2021
2 797
Personnage per = new Personnage()
{
};

C'est une solution qui est encore plus moche que le problème original ! Tu instancies à la volée une classe abstraite dans le seul but de pouvoir utiliser les constructeurs des classes concrètes. Tu ne te rends pas compte de l'énormité logique de ce que tu fais...

Arrêtes de faire compliqué, walidowich et moi t'avons donner la même réponse, appliques là.
"si vous déclariez tes classes hors la classe principale Personnage, le problème disparaitra"
"tu ne fais pas de classes internes, mais tu mets chaque classe dans son propre fichier."
Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
75
Ta classe public principale est Personnage, alors, le fichier source doit être nommé aussi Personnage et pas Personnage1.
Comme KX a dit, des classes internes dans une classe abstraite ne reflète pas l'objectif de l'exercice qui l'héritage, le polymorphisme et, peut être mais très improbable, la nomenclature automatique des classe ineternes.
ok,ça marche,j'ai encore une petite question:
dans l'output j'ai:

"Instance de Personnage$Guerrier"

d'où vient ce $
Messages postés
16251
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2021
2 797
Parce que c'est une classe interne (comme quoi on parle dans le vide...), le nom de la classe est composée du nom de la classe principale et celui de la classe interne. Tu peux regarder dans tes binaires, tu auras des fichiers Personnage$Guerrier.class Personnage$Chirurgien.class, etc.

Pour des classes anonymes tu auras parfois des $1, $2, etc.
Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
75
crée des classes externes et tu aura une nomenclature normale.
l'exemple que t'a cité est très répondu dans les cours pédagogiques d'apprentissage du langage Java, alors ne saute pas des parties si t'es intéressé de comprendre plutot que de réussir à exécuter un programme.

Bonne chance.
merci beaucoup,vos aides m'étaient très précieuse
j'ai modifié un peu mon prg ainsi:


public static void main(String[]args)
{

Personnage per = new Personnage()
{
};
Personnage[] tPers = {per.new Guerrier(),per.new Chirurgien(),per.new Civil(),per.new Sniper(),per.new Medecin() };
String[]tArmes={"pistolet","pistolet","couteau","fusil à pompe","couteau"};

//for(Personnage p:tPers)
for(int i=0;i<tPers.length;i++)
{
System.out.println("\nInstance de "+tPers.getClass().getName());

System.out.println("******************************************************");
//p.combattre();
//p.combattre();
tPers[i].combattre();
tPers[i].setArmes(tArmes[i]);
tPers[i].combattre();
tPers[i].seDeplacer();
tPers[i].soigner();
}

}
dans l'output j'ai :
Instance de [LPersonnage;
******************************************************
--------------------------------------------------------
-----------------------------------------------------

avant j'avais $
maintenant [L
est ce que c'est normal?

et encore à la place
instance de Guerrier; ainsi Chirurgien,.......

j'ai :
Instance de [LPersonnage;
******************************
pour chaque

pouvez vous m'explliquer svp
Messages postés
16251
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2021
2 797
C'est parce que tu affiches la classe de tPers au lieu d'afficher celle de tPers[i]
Le [L indique que c'est un tableau d'objets.
merci beaucoup

System.out.println("\nInstance de "+tPers[i].getClass().getName());
mais le résultat au lieu d'avoir:
Instance de $Chirurgien

j'ai :
Instance de Personnage$Chirurgien
Messages postés
16251
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2021
2 797
Parce que tu as encore des classes internes !
Pour avoir "Chirurgien" il faudrait que la classe Chirurgien soit dans son propre fichier Chirurgien.java, pas à l'intérieur de la classe Personnage.

C'est ce qu'on n'arrête pas de te dire dans tous les sens depuis hier !!!