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

Collection et Stream Java Discussion :

Probleme avec Hashtable


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut Probleme avec Hashtable
    Mon probleme:

    ma méthode containsKey de Hashtable me retourne true. (ce qui me permet de conclure que la clé existe bien dans ma table)
    quand j'appel la méthode get elle me retourne une value null !!!! comme si elle n'a pas retrouvée ma clé avec la méthode get.
    C'est peut être un problème avec mon hashCode.
    Voila mes sources:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(!hashtable.containsKey(key)){
    		    			Value value = new Value(1);
    		    			hashtable.put(key,value);
    			    }else{
    				    	Value value = hashtable.get(key);
    				    	//ici value == null !!!!!!!!!!!!!!
    				    	hashtable.put(key,value);
    			    }
    Voila ma class Key
    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
     
    public class Key{
     
        	String className; 
        	String methodNameDesc;
        	int section;
     
    	public Key(String className, String methodNameDesc, int section) {
    		this.className = className;
    		this.methodNameDesc = methodNameDesc;
    		this.section = section;
    	}
     
    	public boolean equals(Object o){
    		if(o == null){
    			return false;
    		}
    		Key k = (Key)o;
    		if(k.getClassName().equals(this.className)
    			&& k.getMethodNameDesc().equals(this.methodNameDesc)
    			&& k.getSection()==this.section){
    			return true;		
    		}
    		return false;	
    	}
     
    	public int hashCode(){
    		int result=0;
    		for(int i=0;i<className.length();i++){
    			result += Integer.valueOf(className.charAt(i));
    		}
    		for(int i=0;i<methodNameDesc.length();i++){
    			result += Integer.valueOf(methodNameDesc.charAt(i));
    		}
    		result += section;
    		return result;
    	}

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    la seule raison pour laquelle containsKey retournerais true mais que le get renverrais null, avec ton code, serait qu'un autre thread, entre les deux opérations, supprime l'entrée.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut ok merci
    c'est tout a fait possible que ce soit cela.

    Comment puis-je faire pour remédier a cela?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    ne pas modifier ta table depuis plusieurs thread en même temps, ou alors gérer correctement les accès concurent avec des bloc synchronized aux bons endroits.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut ok j'ai remarqué quelque chose
    j'ai ajouté le code :

    Collections.synchronizedMap(hashtable);
    ->cela ne change rien.

    j'ai déclaré la méthode dans laquelle je fais les opérations synchronized.
    -> j'ai toujours le même problème.

    en rajoutant un bloc synchronized(this) autour de chaque put et chaque get.
    -> même problème

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par GroRelou Voir le message
    j'ai ajouté le code :

    Collections.synchronizedMap(hashtable);
    ->cela ne change rien.
    Ca évitera les "bug" interne à datatable. C'est à faire absolument mais non suffisant


    j'ai déclaré la méthode dans laquelle je fais les opérations synchronized.
    -> j'ai toujours le même problème.
    Toutes les méthodes dans lesquelles tu manipule en lecture ou écriture ta datatable doivent être synchronized sur le même verrou.

    en rajoutant un bloc synchronized(this) autour de chaque put et chaque get.
    -> même problème
    Ca ne sert à rien puisque le problème surviens entre les appels.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut c'est pas les threads
    Preuve que c'est pas les threads
    voila 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
     
    static int compteur2 = 0;
     
    void mamethod(){
     
       if(!hashtable.containsKey(key)){
    		Value value = new Value(1);
    		System.out.println("avant put "+compteur2);
    		hashtable.put(key,value);	
    		System.out.println("apres put, avant get bidon "+compteur2);
    		Value value2 = null;
    		value2 = hashtable.get(key);
    		System.out.println("apres get bidon "+compteur2);
       }else{
    		System.out.println(compteur2);
    		Value value = null;
    		System.out.println("avant get"+compteur2);
    	        value = hashtable.get(key);
    		System.out.println("apres get"+compteur2);
    		value.addNbTimes();
    		hashtable.put(key,value);
       }			    
     compteur2++;
    }
    je fais compteur2++ à la fin de ma méthode et tous les compteur2 affichées dans ma console se suivent donc pas de thread qui viennent perturber le bon fonctionnement.

    Non mon problème est plutot du à mon hashCode je pense ?
    non?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    ton hashcode n'a pas de soucis. En effet, il retourne une valeur toujours la même pour les meme données dans le clé.

    Comment en conclue-tu que ta Value retournée par la hastable est null? Je ne vois aucun test dans ton code là dessus.

  9. #9
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Bonjour,
    premièrement je voudrai juste te confirmer que tes méthodes hashCode et equals sont cohérentes, à savoir que si deux Key sont égaux, alors ils auront le même hashcode.
    Sinon, je vois une autre idée:
    N'as-tu pas fait un peu plus haut un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     hashtable.put(key, null);
    Si c'est le cas il connait bien la clé, mais l'objet renvoyé sera null...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut Merci beaucoup
    Merci beaucoup tu m'a réellement aidé à trouver mon problème et c'est en fait ta dernière remarque qui m'a permit de trouver la solution.

    En fait pour savoir si value == null je faisai un System.out.println qui levé une exception.

    En cherchant un peu j'ai vu que le problème venait de mon toString de ma class Value.

    Merci de m'avoir aidé à trouver la solution a+.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Jidefix Voir le message
    N'as-tu pas fait un peu plus haut un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     hashtable.put(key, null);
    Si c'est le cas il connait bien la clé, mais l'objet renvoyé sera null...
    pour info Jidefix, on ne peux pas stocker de null dans une hashtable -> donc ce cas est impossible

  12. #12
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pour info Jidefix, on ne peux pas stocker de null dans une hashtable -> donc ce cas est impossible
    Autant pour moi comme ça marchait avec les HashMap je me suis dit que ça pouvais faire ça aussi avec les hashtable

  13. #13
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Par défaut
    Citation Envoyé par GroRelou Voir le message
    Collections.synchronizedMap(hashtable);
    ->cela ne change rien.
    On pouvait en fait s'en douter. Une Hashtable correspond en gros à une HashMap synchronisée

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

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 11h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 08h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 23h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 08h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 09/06/2002, 00h06

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