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

Langage Java Discussion :

[Language] Problème de ClassCastException sur un Vector


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut [Language] Problème de ClassCastException sur un Vector
    Bonjour à tous et à toutes,

    Voici mon problème,
    dans un Vector je place un Objet Date suite à une query dans mon EJB, ensuite je veux le caster dans un Object Date, et l'opération catch un java.lang.ClassCastException.

    (Je dois renvoyer un Vector car il contient aussi des Strings et pas seulement un ou plusieurs Objets Date !)

    Voici la ligne incriminée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date dateD = (Date) dDate.get(i);
    Je vous avoue que je suis un peu perdu, car la suite de mon programme se déroule sans encombre et il m'est meme possibe de raliser le test suivant sans encombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean previous = dateD.before(aujourdhui);
    Pourriez vous m'aider à éclaircir ceci ??

    D'avance merci a tous.

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Es-tu sûr que cet élément de ton vecteur est bien une Date ?
    Que t'affiche le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println( dDate.get(i).getClass().getName() );
    a++

  3. #3
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut
    Voilà ce qu'il me renvoit
    java.sql.Date
    Et voici ce que je fais dans mon EJB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dDate.addElement(myRs.getDate("DEPLOYDATE"));
    Donc je comprends vraiment pas !

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Il y a deux types Date dans le Jdk, java.util.Date et java.sql.Date, mais la seconde herite de la premiere donc ca devrait marcher .. etrange ton probleme..

    Tu pourrais faire le System.out.println dans ton block catch .. pour verifier que l'element provoquant le probleme est bien celui la ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Montre nous le code ainsi que la ligne exacte du ClassCastException...

    a++

  6. #6
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut
    Ok je test et je te dis quoi, mais le pire c'est que lorsue je fais un println de dateD if m'affiche la bonne valeur, le prog continue affiche tous les println suivant et catch seulement a la fin !
    Alors que normalement lors du try si il rencontre une erreur il stop et va dans le catch ! Ici pas, il continue et puis catch ! Mon prog fait ce qu'il a a faire jusqu'au bout, c'est super étrange

    Et en plus ce qui est affiché après le catch s'affiche aussi !

    Voilà le code complet Bon je débuggai donc y'a des println partout !)
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    package be.proximus.cecu.ivr.thread;
     
    import be.ivr.ejb.upload;
    import be.ivr.ejb.uploadHome;
    import be.eventlog.util.*;
     
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.rmi.PortableRemoteObject;
    import java.sql.Date;
    import java.util.Vector;
    import java.io.InputStream;
    import java.lang.Thread;
    import java.text.SimpleDateFormat;
    import java.text.DateFormat;
     
    public class IVRPackage extends Thread {
     
      boolean keepRunning = true;
     
      private CECULogger logger = null;
     
      public void run(){
     
        while(keepRunning){
     
          Vector dDate = new Vector();
          InputStream in = null;
          boolean isDeployed = false;
          boolean previous = false;
          boolean after = false;
          int interval = 60000;
          int num = 0;
          int yes = 1;
          String deployed = "";
          String server = "";
          String username = "";
          String password = "";
          String destinationFolder = "";
          String id = "";
          Context ctx = null;
     
          try{
            logger = new CECULogger(CECULogger.IVR, "");
            ctx = new InitialContext();
            Object ref = ctx.lookup("upload");
            uploadHome uph = (uploadHome) PortableRemoteObject.narrow(ref, uploadHome.class);
            upload up = uph.create();
     
            interval = up.getTimeInterval(); //Contains the timeInterval for the thread's jobs.
            System.out.println("Time interval : " + interval);
            dDate = up.deployDate(); //Contains the deploy date of the IVR_PACKAGE.
            num = dDate.size(); //Contains the number of IVR_PACKAGE to deploy.
            System.out.println("Number of IVR_Package to deploy : " + num);
            Date aujourdhui = new java.sql.Date(new java.util.Date().getTime()); //Contains the current date.
            System.out.println("Date : " + aujourdhui);
            DateFormat dateFormat2 = new SimpleDateFormat("yyyyMMddhhmmss"); //Set the Date format to yyyyMMddhhmmss
            String fileName = dateFormat2.format(new java.util.Date()) + ".zip"; //Contains the fileName, fomated like this "yyyyMMddhhmmss.zip" .
            System.out.println("File name : " + fileName);
            server = up.getFTPAddress(); //Retrieve the FTP address.
            System.out.println("Server name : " + server);
            username = up.getFTPUser(); //Retrieve the FTP login.
            System.out.println("Username : " + username);
            password = up.getFTPPassword(); //Retrieve the FTP password.
            System.out.println("Password : " + password);
            destinationFolder = up.getDestFolder(); //Retrieve the FTP folder where the IVR_PACKAGE will be uploaded.
            System.out.println("DestinationFolder : " + destinationFolder);
     
            for (int i = 0; i < num; i++) {
     
              -------  Le problème vient d'ici ! ------
     
              Date dateD = (Date) dDate.get(i); //Contains the deploy date of the IVR_PACKAGE.
     
     
              --------------------------------------
     
     
              //System.out.println("Object getClass()"+dateD.getClass());
              id = (String) dDate.get(i + 1); //Contains the ID of the IVR_PACKAGE to deploy.
              System.out.println("Deploy date : " + dDate.get(i)+" Id of the Blob : "+dDate.get(i+1));
              System.out.println("Deploy date : " + dateD);
              System.out.println("Test Dev : "+ dDate.get(i).getClass().getName() );
              previous = dateD.before(aujourdhui); //Contains true if the DEPLOYDATE is < than the current date.
              System.out.println("previous : " + previous);
              deployed = up.IsDeployed(id); //Contains 0 if the IVR_PACKAGE is not yet deploy, and 1 if deployed.
              System.out.println("deployed : " + deployed);
     
              if ("0".equals(deployed)) { //Test if if we need to upload the IVR_PACKAGE.
                if (previous) {
                  if (i > 0) {
                    i--;
                  } else {
                    i = 0;
                  }
     
                  in = up.getBlob(id); //Contains the InputStream of the Blob.
                  System.out.println("InputStream : " + in);
                  isDeployed = up.uploadBlob(server, username, password, fileName, in,destinationFolder); //We uplpoad the IVR_PACKAGE, and isDeployed is set to true, if the upload was successfull.
                  System.out.println("File uploaded 3 : " + isDeployed);
                  if (isDeployed) {
                    up.SetDeployed(yes, id); //Now that we have upload the IVR_Package we set the deployed field to true.
                    logger.info("File "+ fileName +" uploaded successfully.");
                    System.out.println("File uploaded successfully.");
                  }
                }else {
                  after = dateD.after(aujourdhui);
                  if (after) {
                    i++; //To reach the next Blob's deployDate.
                  }
                }
              }
            }
            Thread.sleep(interval); //Time interval between the Thread tasks.
            System.out.println("Time interval : " + interval);
          }catch (Exception e) {
            this.keepRunning = false;
            e.printStackTrace();
            logger.error(ErrorCode.GENERAL_JAVA_EXCEPTION, "Exception : " + e);
            System.out.println("Test Dev : "+ dDate.get(0).getClass().getName() );
          }
          System.out.println("Keep Running value : "+keepRunning);
        }
      }
     
      public void destroy() {
        try{
          logger = new CECULogger(CECULogger.IVR, "");
          System.out.println("-- The processus IVRPackage is stopped.");
          logger.info("-- The processus IVRPackage is stopped.");
          this.keepRunning = false;
        }catch(Exception e){
          e.printStackTrace();
          logger.error(ErrorCode.GENERAL_JAVA_EXCEPTION,"Exception : "+e);
        }
      }
     
    }

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Tu pourrais ajouter le texte exact de l'exception ou au moins nous indiquer la ligne .. ca aiderait, merci

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut
    Voilà je l'ai indiqué au dessus,

    Quant au pintln dans mon catch il me renvoie aussi ceci
    java.sql.Date

  9. #9
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    A mon avis le problème vient de ta boucle for... surtout que tu manipule la variable i à l'intérieur... De plus le fait de stocker plusieurs éléments différents et de les récupérer selon leurs index n'est pas super (tu augmente le risque d'erreur)...

    Sinon le getClass().getName() il vaudrait mieux le faire avant le cast que dans le bloc catch (surtout que tu affiches toujours le type du premier élément... Or ton erreur doit surement survenir sur un autre index...)

    a++

  10. #10
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Dans ton catch tu fais ca sur l'element 0, ce qui ne correspond pas forcement l'index lors de l'exception..

    Declare i avant ton try comme ca tu pourras l'utiliser dans ton catch.

    Truc et astuce (Encore avec suzanne cf les BricolGirls): lorsque tu utilises un index dans une boucle for, ne l'appelle pas i ou j mais utilise plutot un nom un peu plus long.
    C'est plus long a ecrire mais si tu as un probleme et que tu fais une recherche sur i dans ton fichier source t'a pas fini .. alors qu'index par exemple..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  11. #11
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut
    Oki thanks pour le conseil, et merci à suzanne des Bricoles Girls

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Par défaut
    Ton erreur est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      id = (String) dDate.get(i + 1); //Contains the ID of the IVR_PACKAGE to deploy

    1) Tu essayes de caster une Date en String...
    2) De plus, tu dépasse les limites de la taille du vecteur (pour i = num-1)


    Mais qui est Suzanne, et qui sont les BricolGirls :

  13. #13
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut
    Merci a toi, mais mon élément (i+1) de mon Vector est bien un String !
    Seul le (i) est de type Date !





    Les Bricoles Girls c'est un film de bricolage d'Alain Chabat, Dominique Farrugia et avec Jamel Debbouze, et 3 top biches dont Suzanne qui,... bricolent

  14. #14
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Deux solutions :
    • Soit ton Vector est mal remplit.
      Soit l'algo de ta boucle est incorrect.


    Donc affiche le type exact et son index avant chaque cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println("Tentative de cast en Date de l'element " + i + " : " 
    	+ dDate.get(i).getClass().getName() );
    Date dateD = (Date) dDate.get(i);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println("Tentative de cast en String de l'element " + i + " : " 
    	+ dDate.get(i).getClass().getName() );
    id = (String) dDate.get(i + 1);

  15. #15
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Par défaut
    En fait je vient de trouver à l'instant, la problème vient de ma boucle, je boucle 1 fois de trop, et donc il essaye de caster un champ vide de mon Vector, ce qui me renvoie l'erreur ClassCastException !

    Donc tu as bien ciblé adiGuba, c'est bien de ma boucle que vient l'erreur !

    Merci à vous tous pour votre aide précieuse, dans le petit casse tête que je me suis construit tout seul par distraction !

    Ciao

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Par défaut
    Pour éviter les problèmes avec les conteneurs d'objet (applicable aussi pour Hashtable, ArrayList, HashMap, etc ...) rien ne vaut un bon test sur l'instance récupérée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (int i=0; i < <monVector.size(); i++) {
      if (monVector.get(i) instanceof <classeAttendue> {
        //qq chose a faire
      }
      else {
         System.out.println("Erreur: object i=" + i " est une instance de " + monVector.get(i).getClass());
      }
    }
    si c'est couteux dans un premier temps, ça peut s'avérer utile en phase de test/debug.

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

Discussions similaires

  1. java.lang.ClassCastException sur un save()
    Par Julien Bodin dans le forum Hibernate
    Réponses: 6
    Dernier message: 06/08/2009, 11h16
  2. Question sur les vectors
    Par Pragmateek dans le forum SL & STL
    Réponses: 28
    Dernier message: 13/05/2006, 14h55
  3. [JNDI] ClassCastException sur un lookup
    Par Bb_TiTi dans le forum JOnAS
    Réponses: 2
    Dernier message: 28/03/2006, 10h12
  4. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  5. [debutant STL] question sur les vectors
    Par killerjeff dans le forum SL & STL
    Réponses: 13
    Dernier message: 19/08/2004, 17h32

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