Problème avec une HashMap en Java - Java - Programmation
Marsh Posté le 10-04-2011 à 19:18:53
Marin2 a écrit : Bonjour, |
Ta méthode addItem() est correcte. Ton problème vient du fait qu'un itérateur n'est pas mis à jour lorsqu'un élément est ajouté ou retiré d'une collection.
Essaie de corriger ton code avec cet indice.
Marsh Posté le 10-04-2011 à 19:24:08
C'est normal, car tu crées l'itérateur alors que ta map est vide. Pour que cela fonctionne, il faut créer l'itérateur dans la méthode getItemList().
Après, il est mieux de faire quelque chose comme ca:
Code :
|
Concaténer des chaînes de caractères dans une boucle for est toujours une mauvaise idée. Les objets StringBuilder (ou String Buffer) sont fait pour.
Marsh Posté le 10-04-2011 à 21:04:28
Ah, d'accord, merci beaucoup pour votre aide.
Autre petite question : j'ai une erreur lors de l’exécution du programme.
Après avoir compilé sans problème, je crée d'abord une instance d'Item (appelée par exemple knife), et une instance de Room (par exemple kitchen), et enfin, je lance la méthode kitchen.addItem(knife).
Et là erreur !!! : java.lang.NullPointerException dans la classe Room sur la ligne :
Code :
|
Voici ma classe Room (ou plutot, les éléments de ma classe Room qui nous intéressent):
Code :
|
et ma classe Item :
Code :
|
Et enfin, ma classe Items (qui n'est pas la même que celle que je vous ai montré dans le message précédent : la HashMap n'est plus de type "Item - Room", mais de type "String - Item" )
Code :
|
Attention : Item et Items sont différentes ! Il y a un S dans la signature de la deuxième, et ce n'est pas la même classe.
Marsh Posté le 10-04-2011 à 21:44:24
1. J'peux dire que tes naming conventions sont ignobles? C'est quoi ces préfixes `p` de partout là
2. Fixe tes generics dans Items
3. Dans le constructeur de Room, tu crées une variable locale aItemList qui shadow la variable de classe. Donc ton aItemList n'est jamais initialisé.
Marsh Posté le 10-04-2011 à 22:02:25
Alors, pour le 1., P comme paramètre. Je mets un p devant les paramètres, un a devant les attributs, et un v devant les variables locales (enfin, j'oublie parfois...)
Par contre, je comprends pas trop tes réponses. C'est quoi un generic ? Et ça veut dire quoi "shadow" ?
Désolé, ces questions sont peut etre débile, je suis loin d'être un pro en java...
Marsh Posté le 10-04-2011 à 22:11:23
Marin2 a écrit : Alors, pour le 1., P comme paramètre. Je mets un p devant les paramètres, un a devant les attributs, et un v devant les variables locales (enfin, j'oublie parfois...) |
Mais... ça sert à rien
Marin2 a écrit : Par contre, je comprends pas trop tes réponses. C'est quoi un generic ? |
Les types sur les collections, genre Map<String, Items>. Tu regardes même pas les warnings du compilo?
Vas lire http://download.oracle.com/javase/ [...] erics.html
Marin2 a écrit : Et ça veut dire quoi "shadow" ? |
http://en.wikipedia.org/wiki/Variable_shadowing
Marsh Posté le 12-04-2011 à 02:01:29
Ok, pour le shadow, c'est reglé. Merci.
Par contre, j'arrive pas à régler le problème des generics. Je ne comprends pas où il faut les mettre dans mon programme (sur la signature de la classe, ça empeche le programme de compiler)
Enfin, une autre question (désolé, je m'arrete plus, vous m'aidez si bien )
J'ai rajouté une fonction "regarder" dans mon programme, qui affiche une description des items dans la room (même code qu'à mon dernier message).
J'ai ajouté à la classe Items ces 2 méthodes :
Code :
|
Cette première méthode marche. Mais je suis un peu perfectionniste, et j'aimerai virer la virgule en trop qu'il y a à la fin de la liste des objets. Je ne maitrise pas assez les méthodes de StringBuilder pour réussir (malgré un bon moment passé à lire la Javadoc). La méthode setCharAt ne marche pas (ou plutot, je n'arrive pas à l'utiliser). Peut etre n'est-ce pas la bonne...
Code :
|
Ici, ça ne compile même pas. Le compilateur dit qu'il ne trouve pas les méthodes getWeight() et getDescription(), qui sont pourtant bien définies dans la classe Item.
Merci de votre aide. J'espère que malgré mes questions incessantes, vous me répondrez quand même. Je vous suis très reconnaissant.
Marsh Posté le 12-04-2011 à 10:55:35
Marin2 a écrit : Ok, pour le shadow, c'est reglé. Merci. Par contre, j'arrive pas à régler le problème des generics. Je ne comprends pas où il faut les mettre dans mon programme (sur la signature de la classe, ça empeche le programme de compiler) |
Les specs de generics, ça va sur les conteneurs génériques. Tu as lu le lien que j'ai donné sur le sujet?
Marin2 a écrit : J'ai rajouté une fonction "regarder" dans mon programme, qui affiche une description des items dans la room (même code qu'à mon dernier message). J'ai ajouté à la classe Items ces 2 méthodes :
Cette première méthode marche. Mais je suis un peu perfectionniste, et j'aimerai virer la virgule en trop qu'il y a à la fin de la liste des objets. Je ne maitrise pas assez les méthodes de StringBuilder pour réussir (malgré un bon moment passé à lire la Javadoc). La méthode setCharAt ne marche pas (ou plutot, je n'arrive pas à l'utiliser). Peut etre n'est-ce pas la bonne... |
StringBuilder#delete
Marin2 a écrit :
Ici, ça ne compile même pas. Le compilateur dit qu'il ne trouve pas les méthodes getWeight() et getDescription(), qui sont pourtant bien définies dans la classe Item. |
Je pense qu'il t'en dit un peu plus. Genre qu'il te dit dans quel objet il cherche ces méthodes et ne les trouve pas, et on en revient directement à tes collections mal typées
Marsh Posté le 12-04-2011 à 16:54:21
Oui, je l'ai lu. Mais bon, j'ai pas tout compris, ça reste pas mal flou.
Sinon, j'utilise bluej comme logiciel (exigence débile de mon prof, j'ai pas le choix). Ca donne pas beaucoup de détails pour les erreurs de compilation. Donc j'en sais pas plus sur l'absence des méthodes getWeight() et getDescription().
Quand j'écris ça dans mon code (dans la classe Items), et que j'enlève mon constructeur, ça ne compile plus (j'ai droit à l'erreur "; expected" ). Je ne comprends pas pourquoi :
Code :
|
Ce n'est pas ça, le conteneur générique ?
Et merci pour delete(), pour le Stringbuilder. Ca marche.
Marsh Posté le 12-04-2011 à 17:07:04
C'est ca qu'il faut ecrire:
Code :
|
Relie le lien de Masklinn ...
Marsh Posté le 12-04-2011 à 17:27:51
Marin2 a écrit : Oui, je l'ai lu. Mais bon, j'ai pas tout compris, ça reste pas mal flou. |
Ça m'étonne, il donnerait moins de détails que le compilateur java (qui en donne déjà pas des masses)?
Marsh Posté le 12-04-2011 à 19:08:02
Ok, un gros merci à tous les deux, c'est vraiment super sympa de votre part. Tous mes problèmes me semblent réglés (jusqu'à la prochaine fois ).
Marsh Posté le 10-04-2011 à 18:09:31
Bonjour,
J'ai un problème dans mon code (ci-dessous). Je n'arrive pas à faire marcher ma méthode getItemsList. J'ai une classe Item (sans s) et une classe Room qui marchent sans problème.
La méthode getName() est dans la classe Item.
En fait, apparemment, mon "while" est toujours false. Je ne sais pas pourquoi. Peut-être que ma méthode addItem() ne marche pas.
Merci de votre aide