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 :

syntaxe hashmap _ NullPointerException


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut syntaxe hashmap _ NullPointerException
    Bonjour,
    j'ai un problème avec la syntaxe du return à la fin de ce code.Quand j'exécute mon programme j'ai une NullPointerException qui est dûe à la ligne du return.
    j'ai l'impression que ça ne retourne pas vraimnt le prix de l'article en fonction des paramètres de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public int getPriceValue(int userID, int articleID){
          HashMap ArticlesUsers = getArticles(userID);
          if (ArticlesUsers != null && ArticlesUsers.get(articleID) != null){
      return ((dSet)ArticlesUsers.get(articleID)).getPriceValue(userID,articleID);
     
          }
          return ((dSet)ArticlesUsers.get(articleID)).getPriceValue(userID,articleID);
      }
    Help!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Je pense que ArticlesUsers.get(articleID) retourne null !

    La question est : que retournes-tu quand ArticlesUsers.get(articleID) vaut null ?

    Tu peux soit :

    - retourner une valeur par défaut (ex: 0).
    - lever une exception car ce n'est pas un comportement attendu.

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    j'avais une ligne aussi pour ce cas, je faisais "return 0".
    pour, ArticlesUsers.get(articleID), j'ai fait un test en appelant cette méthode dans mon main et ça m'affiche bien des résultats

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Il y a quelque chose que je ne comprends pas :

    Dans ((dSet)ArticlesUsers.get(articleID)).getPriceValue(userID,articleID), la méthode getPriceValue(userID,articleID) est la même que celle dont tu fournis le code source. La méthode s'appelle elle-même avec les mêmes paramètres ?

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    t'as bien raison, c'est la même méthode
    ça paraît pas très cohérent, sinon je peux faire comment si je veux récupérer le PriceValue?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    En fait je ne vois pas trop bien ce que tu veux faire...

    Pourquoi quand tu fais getArticles(userID) tu ne renvoies pas plutôt une Collection d'objets de type Article ayant un atribut price ?

    Je suis peut-être à côté de la plaque mais tu pourrais dans ce cas faire quelque chose de simple comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int total = 0;
    Collection/*<Article>*/ articlesUser = getArticles(userID);
    for (Iterator it=articlesUser.iterator(); it.hasNext();)
    {
        Article article = (Article)it.next();
        total += article.getPrice();
    }
    Ou encore plus simple si tu es en Java 5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int total = 0;
    for (Article article : getArticles(userID))
        total += article.getPrice();
    Quels types d'élements contient ta HashMap ArticlesUsers ? (clé/valeur)

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Merci, désolé pour le retard de ma réponse..dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int total = 0;
    for (Article article : getArticles(userID))
        total += article.getPrice();
    ça me renvoie le nbr total d'articles achetés par utilisateur. Alors que moi je cherche à récupérer tous les ID des articles achetés un par un.

  8. #8
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Bonjour,
    ta méthode telle que tu l'as décrite dans ton premier post a un parfum de récurssivité...
    Mais j'ai du mal à comprendre ce que tu cherches à obtenir. Pour moi getPriceValue doit retourner un prix et vu que tu passes en paramètres un identifiant client et un identifiant article, ta méthode devrait retourner le prix de l'article pour ce client non ?
    Le truc qui était bizarre dans ton premier code est que tu faisais un test pour savoir si c'était "null" ou pas et de toute façon tu renvoyais la même chose. Donc tu ne pouvais que lever une NullPointerException.
    De plus tu rappelais ta fonction avec exactement les même paramètres donc je m'étonne quelle ne tournais pas en boucle sans fin. Tu devais certainement faire un test avec un des éléments null.

    Le code donné par Duc Lebowski te retournera le total de la facture.
    Si tu veux le prix de l'article articleID pour le client userID le code est simple pour autant que tu ais une méthode getPrice() sur ton article.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public int getPriceValue(int userID, int articleID){
          HashMap ArticlesUsers = getArticles(userID);
          if (ArticlesUsers != null && ArticlesUsers.get(articleID) != null){
      return ArticlesUsers.get(articleID).getPrice();
          }
          return 0;//cas où ArticlesUsers est nul ou bien il n'y a pas l'article.
      }
    Si par contre tu veux récupérer la liste de tous les articles d'un client, c'est simplement ArticlesUsers non ?

    Bon code,
    kerinel

  9. #9
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    T'as bien raison, je devrais déja rajouter le "return=0" au cas où il n'y a un résultat null.
    Sinon, moi je voudrais récupérer la liste de tous les articles achetés par un utilisateur et je voudrais que ce résultat soit sous forme de HashMap (pour des raisons de compatibilité avec le reste de mon code)
    quand je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public HashMap getArticles (int userID){
          HashMap ArticlesUsers = (HashMap)getArticles(userID);
          if (getArticles != null){
                 for (Iterator iterateur=ArticlesUsers.values().iterator();iterateur.hasNext(); 
                               {  
                 System.out.println("films votés " + iterateur.next());                            
                 }
              }      
          return null;
        }
    ça me retourne tjr le nbr d'articles achetés, je fais cmt pour retourner le contenu de ma HashMap?

  10. #10
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Bonjour,
    Que veux tu au juste ? seulement la liste de tous les articles sous forme de Hashmap ? Alors si j'ai bien compris ton code c'est tout simplement ArticlesUsers.
    Le problème de ton code ici est que je ne vois pas à quoi s'applique getArticle(userID). Je suppose que c'est une méthode de la classe mais a comment fonctionne-t-elle ? Normalement c'est elle qui te renvoie la Hashmap attendue. Et le prix n'a rien a voir là dedans .

    Là ta méthode te retourneras toujours null.
    Et Iterator sert à passer en revue le contenue de la Hashmap pour faire un traitement.

    Bon code,
    kerinel

  11. #11
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    En fait getArticles n'est pas une méthode mais une HashMap:
    private HashMap <Integer,HashMap> getArticles = new HashMap<Integer,HashMap>();
    les éléments de cette HashMap sont remplies par une autre méthode "add" qui parse un fichier et rajoute ses éléments à cette hashmap:
    //articlesUser est une hashmap aussi qui stocke le prix pour chaque articleID.
    articlesUser.put(articleID, price);
    getArticles.put(userID,articlesUser);

    je me suis compliqué l'existance avec toutes ces HashMap

  12. #12
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Citation Envoyé par flora806 Voir le message
    je me suis compliqué l'existance avec toutes ces HashMap
    Pas forcement, si tu veux stocker un prix pour chaque article en fonction du client il n'y a pas 36 solutions. Mais ton approche n'est pas très orientée Objet car tu utilises des Integer pour identifier tes articles et tes clients alors que il serait je pense préférable d'utiliser directement l'Article ou le Client.

    En tout cas si tu veux la liste des articles d'un client c'est bien getArticles.get(userID) qui te retournera la Hashmap que tu as mis précédemment.

    Tu n'as donc pas besoin d'une méthode pour la récupérer à l'intérieur de ton objet. Si c'est pour l'extérieur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public HashMap getArticlesForUser (int userID){//ne pas utiliser le même nom ça fini par prêter a confusion sinon
           return getArticles.get(userID);
    }
    Et si il n'y a rien il retournera null.

    pour éviter le transtypage utilise les génériques jusqu'au bout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private HashMap <Integer,HashMap<Integer,Integer>> getArticles = new HashMap<Integer,HashMap<Integer,Integer>>();
    bon code,
    kerinel

  13. #13
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Merci Kerinel pour ta réponse, je viens de tester:
    public HashMap getArticlesForUser (int userID){/
    return getArticles.get(userID);
    }
    et ça me donne des résultats bizzares par exp: pour un utilisateur j'ai comme résultat: {1=5}, ça veut dire que pour userID=1(key), j'ai un article acheté dont l'id est=5, alors que ce n'est pas le cas
    pour le 1, j'ai par exp 272 produits achetés et je n'obtiens pas comme ça leur liste.
    j'ai une méthode qui marche bien pour avoir la liste des produits achetés par utilisateur, mais ça me donne une ArrayList comme résultat...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public ArrayList getArticlesParUser(int userID){
          ArrayList userList2 = (ArrayList)allArticlesU.get(userID);
            if (allArticlesU != null){
                        return userList2;
            }
            return null;
        }
    allArticlesU est une HashMap de type: (Integer,ArrayList<Integer>)

  14. #14
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    En fait ce qui s'affiche, c'est l'Id du 1er article acheté de cet utilisateur et pas le tout.
    {1=5}

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    J'ai du mal a comprendre ton probleme.

    Donc pour resumer tu as un certain nombre de listes dont :
    getArticles --> HashMap<Integer,HashMap<Integer,Integer>>
    allArticleU --> HashMap<Integer,ArrayList<Integer>>

    Ces deux listes contiennent presque la meme chose sauf que le allArticleU ne contient que l'id de l'article

    Donc si les deux collections ne te rendent pas le meme nombre d'elements c'est que getArticles est mal remplie.

    car logiquement on devrait avoir:
    allArticleU.get (userId).size ().equals (getArticles.get(userId).size())

    ou alors j'ai rien compris

  16. #16
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Salut,
    Tu as un probleme soit pour afficher tes articles a partir de ta Hashmap, soit pour remplir ta HashMap a partir de ton fichier.
    Si tu veux afficher les articles il faut les passer un par un en revue.
    Pourquoi tu stockes en 2 endroits differents (getArticle et allArticlesU) la même information (liste d'article pour un client). C'est le meilleur moyen d'avoir des données non cohérentes.

    Bon code,
    kerinel

  17. #17
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    les HashMap sont bien remplies, j'ai vérifié en faisant qq tests.
    là avec cette méthode, sur la ligne du print: si j'enlève get(userID), ça m'affiche tous les articles ID sans prenant en compte le paramètre userID qui est dans la méthode.
    et quand je le rajoute, ça m'affiche juste la 1ère valeur de l'id de l'article acheté.
    Auriez vous une idée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public HashMap getArticlesForUser (int userID){
          System.out.println(""+ allArticlesU.get(userID).entrySet());   
          return allArticlesU.get(userID);
          }
    Merciiiii

  18. #18
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Réponse tardive désolé.
    Pour afficher les éléments de la Hashmap il faut nécessairement parcourir la Hashmap.
    si tu veux tester le résultat de getArticleForUser tu dois écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Hashmap<Integer>  lesArticles = leNomDeLaVariable.getArticleForUser(unNumeroDeClient);
    Integer[] lesCles=(Integer[])(lesArticles.keySet().toArray());//On recupere tous les articles
    System.out.println ("Les articles du client "+unNumeroDeClient+": ");
    for (Integer idArticle : lesCles.){
            System.out.println(idArticle+" a "+lesArticles.get(idArticle)+" euros; ");
    }
    afin de parcourir toute la Hashmap.
    leNomDeLaVariable c'est le nom que tu as donné à l'objet que tu testes. Normalement le code que tu nous a montré est dans une classe. Les tests se font a partir d'une autre classe qui instancie la première.

    Au passage modifie l'entête de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public HashMap getArticlesForUser (int userID)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public HashMap<Integer> getArticlesForUser (int userID)
    pour utiliser les génériques jusqu'au bout.

    Si tu n'affiches pas correctement les articles c'est que ta Hashmap est mal remplie.

    Bon code,
    kerinel

  19. #19
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Juste un petit complément, tu peux faire directement celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Map<Integer> lesArticles = leNomDeLaVariable.getArticleForUser(unNumeroDeClient);
    System.out.println ("Les articles du client "+unNumeroDeClient+": ");
    for (Integer idArticle : lesArticles.keySet())
            System.out.println(idArticle+" a "+lesArticles.get(idArticle)+" euros; ");

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/04/2008, 15h14
  2. HashMap en multi-thread et NullPointerException ; comment est-ce possible ?
    Par sami44 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 09/01/2008, 15h43
  3. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 20h20
  4. Syntaxe TASM <-> MASM
    Par LFC dans le forum Assembleur
    Réponses: 3
    Dernier message: 28/02/2003, 15h56
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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