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 :

Souci bizarre pour compiler après ajout d'une méthode


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 42
    Points : 37
    Points
    37
    Par défaut Souci bizarre pour compiler après ajout d'une méthode
    Bonjour à tous.

    J'avance doucement mais sûrement dans mon application.
    Jusque là le peu que j'ai fait fonctionne: ajouter une personne à une liste, enregistrer,...
    Je code l'inverse: enlever une personne à une liste précise.
    Dans l'idée je sais ce qu'il faut faire.
    Je vais donc dans ma classe "Classe" pour ajouter la méthode qui permettra de retirer un élève de sa classe.
    Voici ma classe "Classe:
    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 class Classe implements Serializable {
      public String classe;
      private TreeMap<String,Eleve> listeEleves;
     
         public Classe(){
         listeEleves = new TreeMap<>();
         }
     
         public void ajouterEleve(String n, String p, String c){
           Eleve nouveau = new Eleve(n,p,c);
           String cle = creerUneCle(n,p,c);
           if (listeEleves.get(cle)==null) listeEleves.put(cle,nouveau);
           else {
               JOptionPane jop_EleveExiste = new JOptionPane();
               jop_EleveExiste.showMessageDialog(null, "Cet élève est déjà dans la liste!","ATTENTION", JOptionPane.WARNING_MESSAGE);
           }
         }
     
        private String creerUneCle(String n, String p, String c){
          return n+p+c;
      }
     
         public String quelleClasse(){
             return classe;
         }
     
         public TreeMap<String,Eleve> quelleListe(){
             return listeEleves;
         }
    }
    Et voici la méthode que je désire créer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public void retirerEleve(String n, String p, String c){
    //Traitement...
    }
    J'ai eu droit à une gros message un peu incompréhensible.
    Exception in thread "main" java.io.InvalidClassException: Evalcomp.Classe; local class incompatible: stream classdesc serialVersionUID = 9039132454754699755, local class serialVersionUID = 2724284564699585259
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at java.util.HashMap.readObject(HashMap.java:1155)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1872)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1777)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1970)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1894)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1777)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at Evalcomp.FluxListeClasses.lire(FluxListeClasses.java:33)
    at Evalcomp.Accueil.chargement_Données(Accueil.java:275)
    at Evalcomp.Accueil.<init>(Accueil.java:102)
    at Evalcomp.EvalComp.main(EvalComp.java:11)
    Java Result: 1
    GÉNÉRATION TERMINÉE (durée totale* 1 seconde)
    J'ai enlevé tout traitement: même problème.
    J'ai créé une méthode identique dans le traitement à une autre méthode déjà crée, mais en changeant bien sûr le nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public String quelleClasseBis(){
             return classe;
         }
    Même problème.
    En gros je n'arrive plus à ajouter de méthode.
    Si je supprime ces tentatives, tout fonctionne.
    Je ne comprends l'erreur: pourquoi même en ne mettant rien dedans cela pose un problème?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Lorsque tu sérialise, tu est lié à l'implémentation de ta classe. Ce que tu as fais ici, c'est ceci:


    Classe en "version 1"
    sauver des données par sérialisation
    modifier ton code
    essayer de relire tes données dans une classe en "version 2".


    En gros ici, ObjectInputStream te dit que ce qu'il a dans le fichier ne correspond pas à la classe actuelle (elle n'a pas le même numéro de série). Tes trois solutions sont

    1) effacer ton fichier sérialisé et recommencer avec un fichier vide (au revoir ce que tu avais écrit par le passé)
    2) supprimer tes changements dans la classe (adieu son évolution)
    3) si tu n'a supprimé aucun champs dans la classe, et que tu ne les a pas renommés, rajouter au début de ta classe serializable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static long serialVersionUID = 9039132454754699755L;
    Pour faire comprendre à ObjectOutputStream que la classe n'a pas fondamentalement changé depuis ta sauvegarde précédente.

Discussions similaires

  1. Compilation apres ajout de librairies externes
    Par bibijosh dans le forum JWS
    Réponses: 1
    Dernier message: 12/08/2008, 19h29
  2. [MySQL] Erreur phpmyadmin apres ajout d'une extension
    Par bruce207 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/07/2008, 02h00
  3. Réponses: 0
    Dernier message: 07/05/2008, 11h31
  4. Bouton pour confirmer un ajout dans une table sous Access
    Par cestimagik dans le forum Access
    Réponses: 3
    Dernier message: 31/12/2006, 10h32
  5. Kernel Panic après ajout d'une nouvelle partition
    Par GLDavid dans le forum Administration système
    Réponses: 6
    Dernier message: 25/06/2004, 16h47

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