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

avec Java Discussion :

erreur dans main "no enclosing instance"


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut erreur dans main "no enclosing instance"
    bonjour j'ai cette érreur et je ne vois pas ou est le problème ?
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    No enclosing instance of type Magie is accessible. Must qualify the allocation with an enclosing instance of type Magie (e.g. x.new A() where x is an instance of Magie).
    je vous met le code:
    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
    import java.util.Scanner;
     
    public class Magie {
    	static Scanner clavier = new Scanner(System.in);
     
    	public static void main(String[] args) {
    			Spectateur spec = new Spectateur()	; "l érreur est sur cette ligne j ai new Spectateur de souligné ?"
    	}
    	class Spectateur{
    		//attributs
    		int age;
    		int argent;
     
    		//méthode arrive ou on me demande mon âge et mon argent
    		void arriveEtEcrit() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.println("Mon âge ?");
    			age = clavier.nextInt();
    			//je repeté la question si la somme est plus grande que 100€
    			do {
    				System.out.println("Combien j'ai d'argent ? (<=100€)?");
    				argent = clavier.nextInt();
    			}while(argent>100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
    		int lireAge() {
    			return age;
    		}
    		int lireArgent() {
    			return argent;
    		}
    	}
     
     
     
    }
    j 'essai de tester au fur et à mesure mon code et là ??
    merci pour vos réponses

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Hello,

    déjà, c'est un peu bizarre que tu mettes une classe dans une classe. Tu pouvais pas tout mettre juste dans la classe Magie ? Et si tu voulais une autre classe, tu pouvais pas la mettre en dehors de la classe Magie ?

    Bon, on va dire que tu essaies d'apprendre comment on se sert de classes à l'intérieur d'autres classes.

    Ton code actuel a l'air de vouloir se servir de la classe Spectateur comme si elle était static. Or elle ne l'est pas, donc... Ça marche pas.

    Pour rappel, quand un champ, une méthode, ou une classe imbriquée n'est pas static, ça veut dire qu'ils sont associés aux instances de la classe qui les contient.

    Un champ age de la classe Person, s'il n'est pas static, ça veut dire que tous les objets de classe Person ont leur propre age, et qu'il y a des gens qui ont 24 ans, d'autre 48 ans.
    Une méthode direMonAge() de la classe Person, si elle n'est pas static, ça veut dire qu'on ne peut l'appeler que sur une instance de la classe Person. Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Person paul = new Paul(48);
    paul.direMonAge();
    Et une classe imbriquée Hobby de la classe Person, si elle n'est pas static, ça veut dire qu'on ne peut pas avoir d'instance de Hobby qui ne soit pas liée à une instance de Person, genre le canoë Kayak, c'est un Hobby de paul, pas de n'importe qui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Paul paul = new Paul(48);
    Person.Hobby paulFaitDuKayak = paul.new Hobby("kayak");
    ---

    Or toi, tout ça au-dessus, c'est pas ce que tu veux. Ton objet Spectateur, tu le veux pas spécialement attaché à un objet Magie.

    Il faudrait donc que la classe Spectateur soit static. Ou placée en dehors de Magie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le problème est que la classe Spectateur est une classe interne de la classe Magie : il n'est donc possible de l'instancier que dans le contexte d'une instance de Magie, or le contexte statique de la méthode main n'est pas un contexte d'instance puisque static.

    C'est la même idée dans ce genre de cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Exemple {
        public void exemple() {
            System.out.println("Execution exemple...");
        }
        public static void main(String[] args)  {
               exemple();
        }
    }
    On ne peut pas appeler exemple() directement : il faut avoir une instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exemple exemple = new Exemple();
    exemple.exemple();
    Avec la création de classe, c'est un peu plus compliqué : on ne peut pas créer une instance de classe Spectateur de l'extérieur de la classe Magie. Le code suivant ne fonctionnerait donc pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Magie magie = new Magie(); 
    Spectateur spec = new magie.Spectateur();
    Les classes internes sont faites pour être utilisées de manière interne. Dans le cas contraire :

    1. Soit la classe doit être déclarée externe, dans un autre fichier .java donc
    2. Dans le cadre d'un exercice, ou dans d'autres cadres (que je n’expliciterai pas ici), on peut simplement déclarer la classe Spectateur static, ce qui permet de l'instancier dans un contexte statique :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      static class Spectateur{
    3. Dans le cadre d'un exercice (dans une vraie application professionnelle, ce n'est pas vraiment une bonne idée à mon avis, pour des raisons que je n'expliciterai pas ici), on peut éventuellement déclarer la classe Spectateur externe mais dans le même fichier (regarde bien les accolades pour voir la différence) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public class Magie {
      	static Scanner clavier = new Scanner(System.in);
       
      	public static void main(String[] args) {
      			Spectateur spec = new Spectateur()	; 
      	}
      }
      class Spectateur{ 
      /** etc **/
      }
    4. Il faut réfléchir à l'organisation du programme et quelle est la meilleure solution. Dans le cadre d'un exercice, on peut choisir la solution la plus simple/rapide : dans ton cas, la 2 permet de conserver qu'un seul fichier .java, donc ça pourrait être une solution. Mais tout dépend réellement de l'énoncé. Peut-être que tu dois faire quelque chose plus dans le genre (conserver l'aspect interne et procéder à l'instanciation en interne) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public class Magie {
       
          public Magie() {
                Spectateur spectateur = new Spectateur();
          }
          public static void main(String[] args) {
               new Magie();
          }
       
          class Spectateur {
          }
       
      }


    Attention, dans les cas 2 et 3, la variable statique clavier n'est plus directement. Il faut donc adapter. Par exemple, en changeant l'accès par Magie.clavier tant que le code fait partie d'une classe du même package (puisque la portée de clavier est package). Il y a plein d'autres manières que je n'expliciterai pas ici.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    mais oui, j'avais pas fait attention que la classe magie englobait tout au lieu d englober que le main , c est pour ça que je n 'avait jamais eu cette erreur ,c'est le métier qui rentre .
    merci à tout les 2 pour votre aide.

  5. #5
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    je vous met une partie du code car je suis coinçé, je n 'arrive pas à passer la valeur "age" de la class spectateur à "ageLu" de la class Assistant ,Pourtant en paramètre de la méthode lire de la class Assistant je déclare un objet papier de type Spectateur pour ensuite me servir de la méthode "age" sur cet objet =>" papier.age()"
    en écrivant ageLu = papier.age(); ne récupère t'on pas la valeur de retour de la méthode age ?
    un morceau du code:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    import java.util.Scanner;
     
    public class Magie {
     
    	public static void main(String[] args) {
    		 Spectateur pierre = new Spectateur() ;
    		 Assistant charles = new Assistant();
    		// Magicien gandalf = new Magicien();
    		// gandalf.tourDeMagie(pierre, charles);
    		 pierre.arriver();
    		 pierre.age();
    		 charles.calculer();
     
    	}
    }
    	class Spectateur {
    		// attributs
    		static Scanner clavier = new Scanner(System.in);
    		private int age;
    		private int argent;
     
    		// méthode arrive ou on me demande d ecrire sur un papier mon âge et mon argent
    		public void arriver() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.print("Mon âge ? ");
    			age = clavier.nextInt();
    			// je repete la question si la somme est plus grande que 100€
    			do {
    				System.out.print("Combien j'ai d'argent ? (<=100€)? ");
    				argent = clavier.nextInt();
    			} while (argent > 100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
     
    		public void ecrire() {
    			System.out.println("[spectateur]J'écris le papier");
    		}
    		public int age() {
    			System.out.println(age);
    			return age;
     
    		}
    		public int argent() {
    			return argent;
    		}
     
     
    	}
     
    	class Assistant {
    		// attributs
    		private int ageLu;
    		private int argentLu;
    		private int resultat;
     
    		// il faut une méthode pour calculer le résultat obtenu avec l'âge et l'argent  lu sur le papier
     
    		public void Lire(Spectateur papier) {
    			System.out.println("[assistant] je lis le papier");
    			ageLu = papier.age();
    			argentLu = papier.argent();
     
     
    		}	
    		public void calculer() {	
    			System.out.println("[assistant]je calcul mentalement");
    			System.out.println(ageLu);
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
    		}
     
    		// ensuite il faut donner le resultat à voix haute
    		int direAHauteVoix() {
    			System.out.println("[assistant] j'annonce " + resultat);
    			return resultat;
    		}
     
    	}
    merci pour vos réponse, j 'ai mis quelques print pour m'aider mais j ai "0"

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pierre.age();
    charles.calculer();
    L'appel de pierre.age() ne fait que lire la propriété age et n'en fait rien... il n'y a en tout cas aucune raison que ça modifie la variable ageLu de charles.

    Tu as une méthode lire(Spectateur) dans Assistant. Ce n'est pas la meilleure façon de faire, mais au moins l'appel de cette méthode initialiserait bien les variables de Assistant, ageLu et argentLu, utilisés dans calculer() pour faire le calcul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    charles.lire(pierre);
    charles.calculer();
    Je dis que ce n'est pas la meilleure façon de faire parce que ça oblige à appeler les méthodes dans un ordre particulier, ce qui ne rend pas la classe très intuitive. Soit tu fais des méthodes dans Assistant, pour affecter les valeurs de ces variables, du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setAge(age) {
       ageLu=age;
    }
    en faisant pareil pour "argent"/"argentLu"
    et dans main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    charles.setAge(pierre.age());
    charles.setArgent(pierre.argent());
    charles.calculer();
    soit tu ajoutes à calculer des paramètres pour pouvoir faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void calculer(int age, int argent) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.calculer(pierre.age(), pierre.argent());
    ou, en fusionnant lire() et calculer() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void calculer(Spectateur spectateur) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.calculer(pierre);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    merci joel pour ton aide,
    voila je mets le code avec les rectifs
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    import java.util.Scanner;
     
    public class Magie {
     
    	public static void main(String[] args) {
    		 Spectateur pierre = new Spectateur() ;
    		 Assistant charles = new Assistant();
    		 Magicien gandalf = new Magicien();
    		 gandalf.tourDeMagie(pierre, charles);
     
    	}
    }
    	class Spectateur {
    		// attributs
    		static Scanner clavier = new Scanner(System.in);
    		private int age;
    		private int argent;
     
    		// méthode arrive ou on me demande d ecrire sur un papier mon âge et mon argent
    		public void arriver() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.print("Mon âge ? ");
    			age = clavier.nextInt();
    			// je repete la question si la somme est plus grande que 100€
    			do {
    				System.out.print("Combien j'ai d'argent ? (<=100€)? ");
    				argent = clavier.nextInt();
    			} while (argent > 100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
     
    		public void ecrire() {
    			System.out.println("[spectateur]J'écris le papier");
    		}
    		//je cree ces méthodes pour récuper les variables âge et argent dans les autres classes
    		public int age() {
    			return age;
    		}
    		public int argent() {
    			return argent;
    		}
    	}
     
    	class Assistant {
    		// attributs
    		private int ageLu;
    		private int argentLu;
    		private int resultat;
     
    		// il faut une méthode pour calculer le résultat obtenu avec l'âge et l'argent  lu sur le papier
     
    		public void lireEtCalculer(int age,int argent) {	
    			System.out.println("[assistant] je lis le papier");
    			System.out.println("[assistant]je calcul mentalement");
    			ageLu = age;
    			argentLu = argent;
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
    		}
     
    		// ensuite il faut donner le resultat à voix haute
    		int direAHauteVoix() {
    			System.out.println("[assistant] j'annonce " + resultat);
    			return resultat;
    		}
     
    	}
    	class Magicien {
    		private int resultat;
    		private int ageTrouve;
    		private int argentTrouve;
     
    		// méthode pour calculer l age et l'argent du spectateur
    		public void calculer(int resul){
    			resultat = resul;
    			resultat += 115;
    			ageTrouve = resultat /100;
    			argentTrouve = resultat %100;
     
    		}
    		public void tourDeMagie(Spectateur pierre,Assistant charles) {
    			Spectateur papier = new Spectateur();
    			pierre.arriver();
    			System.out.println("un petit tour de magie ");
    			pierre.ecrire();
    			charles.lireEtCalculer(pierre.age(),pierre.argent());
    			calculer(charles.direAHauteVoix());
    			annoncer();
    		}
    		public void annoncer(){
    			System.out.println("[Magicien ] hum je vois que vous etes agés de "+ageTrouve+" ans ,et que vous avez "+argentTrouve+ " euros dans les poches");
     
    		}
    	}
    Donc j'ai fait la même modif pour la méthode calculer() du magicien avec un paramètre résultat.Donc si j'ai bien compris même si avec un print on lit un return ,on ne peut pas faire :
    int variable à instancié = retour de l entier de la méthode trucmuche ?
    il faut mettre la méthode de celui ci en paramètre sinon c'est juste une lecture ?
    merci pierre.

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

Discussions similaires

  1. Déclencher une erreur dans main.
    Par jeremux dans le forum C
    Réponses: 2
    Dernier message: 07/10/2011, 14h59
  2. probleme paramaitre instance dans main()
    Par lovedesitaliens dans le forum C#
    Réponses: 1
    Dernier message: 04/11/2010, 14h26
  3. Erreur dans mon main
    Par diditin dans le forum Langage
    Réponses: 8
    Dernier message: 19/12/2006, 14h28

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