Java - NullPointerException
Résolu/Fermé
A voir également:
- Java - NullPointerException
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Java décompiler - Télécharger - Langages
- Java runtime - Télécharger - Langages
4 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 28/09/2011 à 20:50
Modifié par KX le 28/09/2011 à 20:50
Tu as confondu size et capacity, or capacity est supérieur à size, du coup à un moment tu vas avoir i>=size donc elementAt(i) n'existe pas, il vaut null, et null.NomArme te renvoit une NullPointerException.
Remarque, il est bien plus efficace d'utiliser ce genre de code :
Autre remarques :
Tu n'es pas obligé de créer de nouveaux objets explicitement :
Tu peux directement faire :
De plus Vector est équivalent à ArrayList, à part que Vector est synchronisé, ce qui le ralentit dans une utilisation non-synchronisé (ce que tu fais). Vu ton code, l'idéal serait sûrement la LinkedList qui est la plus légère, mais ce n'est que de l'optimisation ;-)La confiance n'exclut pas le contrôle
for (int i = 0; i < TabArmes.TabArmesCC.size(); ++i) TabNomArme.add(TabArmes.TabArmesCC.elementAt(i).NomArme);
Remarque, il est bien plus efficace d'utiliser ce genre de code :
for (CArmesCC c : TabArmes.TabArmesCC) TabNomArme.add(c.NomArme);
Autre remarques :
Tu n'es pas obligé de créer de nouveaux objets explicitement :
NomArme = new String (PNomArme); Degats = new Integer (PDegats); Vit = new Integer (PVit);
Tu peux directement faire :
NomArme = PNomArme; Degats = PDegats; Vit = PVit;
De plus Vector est équivalent à ArrayList, à part que Vector est synchronisé, ce qui le ralentit dans une utilisation non-synchronisé (ce que tu fais). Vu ton code, l'idéal serait sûrement la LinkedList qui est la plus légère, mais ce n'est que de l'optimisation ;-)La confiance n'exclut pas le contrôle
Je ne suis pas contre l'optimisation au contraire ! Je fais juste avec les connaissances que j'ai ! ;)
Pour ce qui est de la création des objets, j'avais fait sans les new à la base, mais vu que je ne trouvais pas mon erreur, j'ai mit ça en désespoir de cause.
J'aimerai un peu plus d'explication ta deuxieme boucle si ça ne te gêne pas, je ne vois pas comment elle fonctionne
En tout cas Merci !
EDIT : j'ai remplacé capacity () par size () et ça ne marche pas T_T
les messages d'erreurs renvoyés sont, avec à la ligne 382, le contenu de la boucle for, en 270 le début de la fonction NewArme () et en 57 l'appel de la fonction NewArme () dans le constructeur de la classe CInventaire :
Pour ce qui est de la création des objets, j'avais fait sans les new à la base, mais vu que je ne trouvais pas mon erreur, j'ai mit ça en désespoir de cause.
J'aimerai un peu plus d'explication ta deuxieme boucle si ça ne te gêne pas, je ne vois pas comment elle fonctionne
for (CArmesCC c : TabArmes.TabArmesCC) TabNomArme.add(c.NomArme);
En tout cas Merci !
EDIT : j'ai remplacé capacity () par size () et ça ne marche pas T_T
les messages d'erreurs renvoyés sont, avec à la ligne 382, le contenu de la boucle for, en 270 le début de la fonction NewArme () et en 57 l'appel de la fonction NewArme () dans le constructeur de la classe CInventaire :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Interface_Graphique.CInventaire.NewArme(CInventaire.java:282) at Interface_Graphique.CInventaire.access$0(CInventaire.java:270) at Interface_Graphique.CInventaire$1.actionPerformed(CInventaire.java:57) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
28 sept. 2011 à 22:53
28 sept. 2011 à 22:53
Ces deux codes sont équivalents :
Pour chaque index 'i' du tableau TabArmes.TabArmesCC, ajouter le nomArme de l'élément i à TabNomArme
Pour chaque CArmesCC 'c' contenu dans TabArmes.TabArmesCC, ajouter c.NomArme à TabNomArme.
L'ordre sera le même, mais l'avantage du deuxième c'est qu'il n'y a pas besoin de faire "des allers retours" pour chercher l'élement i, il les lit les uns à la suite des autres, ce qui marchera pour n'importe quel classe de Collection (grâce aux itérateurs) alors que la méthode elementAt(i) n'existe que pour la classe Vector...
Pour ton problème, c'est que tu fait TabArmes.TabArmesCC un peu partout, or TabArmesCC n'est pas initialisé ! En effet, d'habitude on fait l'initialisation dans le constructeur or toi tu l'as faite dans une méthode InitTabArmesCC() que tu as oublié !
Voici comment tu pourrais faire ta classe CBanqueArme :
Et ainsi tu aurais :
for (int i = 0; i < TabArmes.TabArmesCC.size(); ++i) TabNomArme.add(TabArmes.TabArmesCC.elementAt(i).NomArme);
Pour chaque index 'i' du tableau TabArmes.TabArmesCC, ajouter le nomArme de l'élément i à TabNomArme
for (CArmesCC c : TabArmes.TabArmesCC) TabNomArme.add(c.NomArme);
Pour chaque CArmesCC 'c' contenu dans TabArmes.TabArmesCC, ajouter c.NomArme à TabNomArme.
L'ordre sera le même, mais l'avantage du deuxième c'est qu'il n'y a pas besoin de faire "des allers retours" pour chercher l'élement i, il les lit les uns à la suite des autres, ce qui marchera pour n'importe quel classe de Collection (grâce aux itérateurs) alors que la méthode elementAt(i) n'existe que pour la classe Vector...
Pour ton problème, c'est que tu fait TabArmes.TabArmesCC un peu partout, or TabArmesCC n'est pas initialisé ! En effet, d'habitude on fait l'initialisation dans le constructeur or toi tu l'as faite dans une méthode InitTabArmesCC() que tu as oublié !
Voici comment tu pourrais faire ta classe CBanqueArme :
class CBanqueArmes extends LinkedList<CArmesCC> { public CBanqueArmes() { add(new CArmesCC("Hallebarde", 60,-15, 6,11,"TR", "CON","Hast / Deux mains","Deux mains", 15, 4,20)); add(new CArmesCC("Harpon", 35, -5, 5, 0,"PER","", "Hast", "Une ou deux mains, Lançable", 11, 0,15)); add(new CArmesCC("Chaîne", 25, 0, 6, 0,"CON","", "Corde", "Complexe, Immobilisation(For 8)",13, 2,15)); add(new CArmesCC("Cestus", 25, 10,3, 0,"PER","TR", "Arme Courte", "", 11,-2,15)); // ... } }
Et ainsi tu aurais :
CBanqueArmes TabArmes = new CBanqueArmes(); LinkedList<String> TabNomArme = new LinkedList<String> (); for (CArmesCC c : TabArmes) TabNomArme.add(c.NomArme); JList ListeArme = new JList(TabNomArme.toArray());
Je vais surement faire ça je pense :) Mais j'ai trouver mon problème, il est quasiment le même, j'avais completement oublié qu'avant de créer un Vector, j'avais fait un tableau, et comme un niais, je l'ai initialisé à 200, une taille aléatoire mais supérieure au nombre d'éléments réels, du coup, quand il veut acceder à un élément n qui n'a pas été initialisé, forcément....
Merci pour ton optimisation, bonne soirée !
Merci pour ton optimisation, bonne soirée !