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 :

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to


Sujet :

Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to
    Bonsoir à tous j'ai un petit souci sur mon projet de programmation:

    J'obtiens toujours cette erreur quand je lance mon programme et je ne comprends pas comment régler ce problème:

    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to Loup
    at Meute.faucheuse(Meute.java:153)
    at Simulateur.main(Simulateur.java:29)

    voici mon 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
     
     
     
           public void divorce()
            {
     
     
    	int e;
     
    		for(e=1; e>=0; e--)
    		{
     
     
     
    		if(((Integer)(((Loup)elementAt(e)).age)) == 13)
    			{
    				if(((String)(((Loup)elementAt(e)).sexe)) == "Male")
    				{
    						int m;
                                     	       	int z = size();
    						for(m=2; m<z; m++)
    						{
    						if(((String)(((Loup)elementAt(m)).sexe)) == "Male")
    							{
    							set(m,e);
    							}
    						}
    				}
     
    				if(((String)(((Loup)elementAt(e)).sexe)) == "Femelle")
    				{
    						int f;
                                     	       	int x = size();
    						for(f=2; f<x; f++)
    						{
    						if(((String)(((Loup)elementAt(f)).sexe)) == "Femelle")
    							{
    							set(f,e);
    							}
    						}
    				}				
     
    			}
    		} 	
     
            }
    Edit: J'ai viré la partie de code qui ne posait pas problème pour des raisons perso.

    Cordialement Toinou

  2. #2
    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 : 55
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le message d'erreur est éloquent :

    • Exception in thread "main" java.lang.ClassCastException: Il y a une ClassCastException : on essaye de caster une variable d'un type vers un autre pas compatible
    • java.lang.Integer cannot be cast to Loup : on essaye de caster un Integer vers la classe Loup : il est impossible que Loup soit compatible avec Integer (Integer ne peut être étendu et c'est une classe de Java)
    • at Meute.faucheuse(Meute.java:153) Dans la méthode faucheuse de la classe Meute (définie par le fichier Meute.java), à ligne 153
    • at Simulateur.main(Simulateur.java:29) : appelée par la méthode main() de la classe Simulateur(définie par le fichier Simulateur.java) à ligne 29


    La ligne incriminée est donc (très probablement, pârce que je n'ai possiblement pas exactement les mêmes lignes que lors de ton exécution) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( (Integer)(((Loup)elementAt(i)).age) == 13)
    (ça pourrait être aussi ((Loup)elementAt(i)).attributsloup();, pour exactement la même raison, donc peu importe.
    En dehors du fait que tu te compliques la vie avec un cast et des parenthèses superflues, ça veut dire que tu essayes de prendre un Integer dans le Vector, et de le caster en Loup. Donc à un moment donné tu mets un Integer dans ton Vector.

    Ce que tu fais dans ta méthode divorce() :

    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
    public void divorce() {
    
    		int e;
    
    		for (e = 1; e >= 0; e--) {
    
    			if (((Integer) (((Loup) elementAt(e)).age)) == 13) {
    				if (((String) (((Loup) elementAt(e)).sexe)) == "Male") {
    					int m;
    					int z = size();
    					for (m = 2; m < z; m++) {
    						if (((String) (((Loup) elementAt(m)).sexe)) == "Male") {
    							set(m, e);
    						}
    					}
    				}
    e est un int, or le second argument de la méthode est l'objet qu'on met à la position indiquée par le premier argument (m). Donc la tu mets e (un int donc) dans le Vector. Un Vector ne pouvant contenir de int, il est automatiquent "convertit" en équivalent objet : un Integer. Plus tard, quand tu récupère cette valeur par elementAt(), et que tu tentes de le caster en Loup, et bien, ça fait logiquement une exception...

    NB on peut simplifier if( (Integer)(((Loup)elementAt(i)).age) == 13) en if( ((Loup)elementAt(i)).age == 13) : age est un int, inutile de la caster, d'autant plus en Integer, pour le comparer à un int (13).

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Quelques remarques supplémentaires :
    • A moins d'utiliser toujours du Java 1.4 (mais pourquoi ?), il est préférable d'utiliser les Generics.
      Cela permet de détecter ce genre d'erreur dès la compilation, et évites d'avoir des casts dans tous les sens !
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      public class Meute extends Vector<Loup> {
    • A propos de cast, tu en utilises plusieurs inutilement, ce qui alourdit la lecture pour rien !!!
    • Attention car tu compares des String avec "==", ce qui ne compare pas l'égalité mais l'identité.
      En clair selon la provenance de la String tu peux avoir des résultats différents.
      Il faut bien sûr utiliser equals() (ou Objects.equals() si tu dois gérer les valeurs null).

    • Pour revenir à Vector... cette classe n'est plus vraiment d'actualité, et il y a très peu de raison de l'utiliser...
      Il est préférable de se tourner vers ArrayList.
      Et au passage il est peut-être préférable d'utiliser la composition plutôt que l'héritage, afin de pouvoir gérer la visibilité des méthodes :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
       public class Meute {
          private final List<Loup> list = new ArrayList<>();
       
          ...
      }
    • Il y a des trucs bizarre dans ton code, comme dans la méthode ageplusun() dont seule la dernière ligne est réellement utile...



    a++

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci joel.drigo grâce à vous j'ai compris mon erreur. Merci adiGuba mais sur ce projet je dois utiliser vector et l'héritage c'est dans l'énoncé de mon sujet
    ps: je suis étudiant en biologie et c'est mon premier programme orienté objet, donc possible que parfois ça vous semble étrange

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/09/2009, 11h36

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