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]Déclaration de variables


Sujet :

Langage Java

  1. #1
    Membre du Club Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Points : 69
    Points
    69
    Par défaut [Language]Déclaration de variables
    bonjour

    Je travaille actuelement sur un annaire simple. J'ai un bout de programme qui me permet de tester mes différentes classes.

    Dans ce programme j'ai une erreur ( pas vraiment une erreur...le programme s'arrete sans messages d'erreurs particuliers) en fonction de la façon dont sont déclarer :

    1ere façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Ajout d'une personne à l'annuaire
    an.ajouterEntree(new Personne(Personne.MR,"DUSCHMOL", "Louis"), 
    	                           new ListNumTel(new NumTel(146761,'P')));
     
    //Parcour de l'anuaire
    Personne p1 = new Personne(Personne.MR,"DUSCHMOL", "Louis");
    System.out.println("numeros de " + p1);
    System.out.println(an.numeros(p1));
    `an` représente mon objet annuaire
    la methode `numero` de annuaire renvoi la liste des numéro de la personne passée en annuaire

    2eme façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //Ajout d'une personne à l'annuaire
    Personne p1 = new  Personne(Personne.MLLE,"DURAND","Sophie");
    	    an.ajouterEntree(p1,new ListNumTel(new NumTel(151171,'D')));
     
    //Parcour de l'anuaire
    System.out.println("numeros de " + p1);
    System.out.println(an.numeros(p1));
    la première façon ne fonctionne pas et je ne comprend pas pourquoi...

    Ce problème semble pouvoir etre corrigé en modifiant la classe personne mais je comprend encore moin pourquoi

    merci pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Quels sont les resultat que tu obtiens dans les deux cas ?
    Tu as essayé d'utiliser un Debuger afin de faire du pas à pas et de verifier la valeur de chaque variable ?
    Apres une lecture rapide moi je ne vois pas d'erreurs !!
    UML avec VIOLET

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Points : 43
    Points
    43
    Par défaut
    Au vue du code, dans le premier cas tu instancie un nouvel objet Personne quand tu fais appel une deuximeme fois à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personne p1 = new Personne(Personne.MR,"DUSCHMOL", "Louis");
    Tu met en commentaire au dessus que tu parcours l'annuaire.
    C'est faux. Tu cree un nouvel objet. Et donc p1 n'est pas là une entrée de ton annuaire puisque tu ne l'a pas ajoutée dedans.

    C.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Citation Envoyé par blech ducou
    Au vue du code, dans le premier cas tu instancie un nouvel objet Personne quand tu fais appel une deuximeme fois à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personne p1 = new Personne(Personne.MR,"DUSCHMOL", "Louis");
    Tu met en commentaire au dessus que tu parcours l'annuaire.
    C'est faux. Tu cree un nouvel objet. Et donc p1 n'est pas là une entrée de ton annuaire puisque tu ne l'a pas ajoutée dedans.

    C.


    Ha bah ouais j'ai dit n'importe quoi , tu as raison !!
    Ceci dit tout depend de comment tu implemente ton annuaire si tu utilise une reference de personne comme clé effectivement p1 est different de l'objet personne que tu ajoute plus haut , sinon tu pourrais utiliser comme clé une chaine de caractere concatenant civilité,nom et prenom et la tu aurais le resultat attendu (enfin je crois !! je suis plus tres sur de moi maintenant ! )
    UML avec VIOLET

  5. #5
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Si tu stockes tes résultats dans une collection, il y a de fortes chances que une réimplémentation de la méthode equals (et sa copine hashCode) de Personne règle le problème.

  6. #6
    Membre du Club Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Points : 69
    Points
    69
    Par défaut
    merci pour toutes ses réponses!

    Quels sont les resultat que tu obtiens dans les deux cas ?
    La 2eme solution écrit correctement le nom de la personne et le numéro de téléphonne

    La première génére un erreur java.lang.NullPointerException lors de l'éxécution de la fonction an.numéro(p1). Le plantage vient au moment ou je test si la clef (p1) passée en parametre est contenue dans la HashMap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public ListNumTel numeros(Personne p) {
    		if(!AnnuaireMap.containsKey(p))
    			return null;
    		else {
    			ListNumTel listTel = (ListNumTel)AnnuaireMap.get(p);
    			return listTel;
    		}
    	}

    Ceci dit tout depend de comment tu implemente ton annuaire si tu utilise une reference de personne comme clé...
    Effectivement, j'utilise un objet personne comme clef pour mon annuaire ( c'est une HashMap) et un objet ListNumTel comme valeur, représentant la liste des numéro de téléphone de la personne (ArrayList)

    effectivement p1 est different de l'objet personne que tu ajoute plus haut
    dans la première solution, la personne p1 que je recrée as les memes attributs qu'une personne existante en tant que clef dans la HashMap, elle devrait donc pointer sur la meme valeur...mais effectivement la fonction containsKey de la HashMap me dis que ce n'est pas la meme..

    Si tu stockes tes résultats dans une collection, il y a de fortes chances que une réimplémentation de la méthode equals (et sa copine hashCode) de Personne règle le problème.
    Là, j'ai pas compris (je débute en java ), je n'ai pas de methodes equals et hasCode dans Personne, la classe personne déclare des variables nom, prénom, civilité...etc

    Les personne sont stockées ensuite comme clef dans l'anuaire, si j'ai bien compris ce qu'on me demandait de fair, parce que y a des fois, je me demande

  7. #7
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#equals(java.lang.Object)

  8. #8
    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,

    Comme cela a été dit il faut redéfinir les méthode equals() et hashCode() !


    En effet, les objets utilisé en tant que clef dans une Map (HashMap, Hashtable, etc...) doivent obligatoirement redéfinir les deux méthodes equals() et hashCode(). Par défaut equals() renvoit true seulement s'il s'agit de la même instance, et hashCode() renvoit une valeur différentes pour chaque objet (l'adresse mémoire dans l'implémentation de Sun il me semble).

    Or la Map utilise ces deux méthodes pour ordonner les clef... Donc si tu ne les rédéfini pas il considèrera que deux instances sont forcément différentes mêmes si elles comportent le même contenu...


    Donc pour la méthode equals() il faut vérifier "manuellement" que tous les attributs de la classe sont égaux :
    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
     
    public boolean equals (Object other) {
     
    	if (this == other) {
    		// S'il s'agit de la même instance
    		// pas besoin d'aller plus loin
    		return true;
    	}
     
     
    	if ( other instanceof Personne ) {
    		Personne otherPersonne = (Personne) other;
     
    		// Comparaison de tous les champs :
    		if ( this.nom.equals(other.nom)
    			&& this.prenom.equals(other.prenom)
    			&& etc... ) {
    			return true;
    		}
    	}
    	return false;
    }
    La méthode hashCode() permet de générer un numéro afin d'optimiser l'ajout des éléments dans une Map. Le hashCode() doit respecter les conditions suivante :
    • Pour une même instance, il ne doit pas varier pendant le déroulement du programme.
    • Si a.equals(b) alors a.hashCode() == b.hashCode()


    Le plus simple est d'utiliser le hashCode() d'un des attributs de ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int hashCode() {
    	return this.name.hashCode();
    }
    a++

  9. #9
    Membre du Club Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Points : 69
    Points
    69
    Par défaut
    waoo! merci! j'aurais jamais trouvé ça tout seul!
    je vais tester et je vous tiens au courrant du résultat,
    encore merci et bonne journée!

  10. #10
    Membre du Club Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Points : 69
    Points
    69
    Par défaut
    ça marche nikel, merci à tous!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/06/2005, 15h04
  2. [Language]Accès aux variables
    Par Adaemon dans le forum Langage
    Réponses: 12
    Dernier message: 27/04/2005, 14h17
  3. [Language]Variables variables
    Par Vader_666 dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2005, 22h52
  4. [Language] Accès à une variable
    Par Boumeur dans le forum Langage
    Réponses: 10
    Dernier message: 10/04/2005, 20h54
  5. Utilisation d'une Variable(Vb) dans d'autre language
    Par cach dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/02/2005, 12h00

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