Java - NullPointerException
Résolu
Hahuha
-
Hahuha -
Hahuha -
Bonjour,
Je fais un petit programme en java, et je cherche à créer une liste de String, ces String étant des données membres d'une classe que j'ai crées. J'ai également fait une fonction qui crée toute une liste d'Objet de ma classe, et j'ai une erreur NullPointerException quand je veux récuperer la donnée membre, quelqu'un pourrait me dire pourquoi ? Voici les extraits de fichiers sources importants :
fichier de créations du vecteur de CArmesCC
fichier où j'ai l'erreur
Merci d'Avance, Bonne Soirée
Je fais un petit programme en java, et je cherche à créer une liste de String, ces String étant des données membres d'une classe que j'ai crées. J'ai également fait une fonction qui crée toute une liste d'Objet de ma classe, et j'ai une erreur NullPointerException quand je veux récuperer la donnée membre, quelqu'un pourrait me dire pourquoi ? Voici les extraits de fichiers sources importants :
package donnees; public class CArmesCC { public String NomArme; int Degats; int Vit; int ForR1; int ForR2; String Mode1; String Mode2; String Categorie; String Special; int Sol; int Frac; int Pres; public CArmesCC (String PNomArme, int PDegats, int PVit, int PForR1, int PForR2, String PMode1, String PMode2, String PCategorie, String PSpecial, int PSol, int PFrac,int PPres) { NomArme = new String (PNomArme); Degats = new Integer (PDegats); Vit = new Integer (PVit); ForR1 = new Integer (PForR1); ForR2 = new Integer (PForR2); Mode1 = new String (PMode1); Mode2 = new String (PMode2); Categorie = new String (PCategorie); Special = new String (PSpecial); Sol = new Integer (PSol); Frac = new Integer (PFrac); Pres = new Integer (PPres); } // Constructeur }
fichier de créations du vecteur de CArmesCC
package donnees; import java.util.Vector; public class CBanqueArmes { public Vector <CArmesCC> TabArmesCC = new Vector <CArmesCC> (); private void InitTabArmesCC () { TabArmesCC.setSize(200); //TabArmesCC.add(new CArmesCC(PNomArme, PDegats, PVit, PForR1, PForR2, PMode1, PMode2, PCategorie, PSpecial, PSol, PFrac, PPres)); // LIVRE DE REGLES - ARMES DE BASE TabArmesCC.add(new CArmesCC("Hallebarde" , 60, -15, 6, 11, "TR","CON", "Hast / Deux mains" , "Deux mains" , 15, 4, 20)); TabArmesCC.add(new CArmesCC("Harpon" , 35, -5, 5, 0, "PER", "", "Hast" , "Une ou deux mains, Lançable" , 11, 0, 15)); TabArmesCC.add(new CArmesCC("Chaîne" , 25, 0, 6, 0, "CON", "", "Corde" , "Complexe, Immobilisation(For 8)" , 13, 2, 15)); TabArmesCC.add(new CArmesCC("Cestus" , 25, 10, 3, 0, "PER", "TR", "Arme Courte" , "" , 11, -2, 15)); // Ca continue longtemps comme ça
fichier où j'ai l'erreur
package Interface_Graphique; import java.awt.*; import java.awt.event.*; import java.util.Vector; import javax.swing.*; import donnees.CBanqueArmes; import donnees.CArmesCC; @SuppressWarnings("serial") public class CInventaire extends JPanel { CInventaire () { // ... } private void NewArme () { final JFrame NewObj = new JFrame ("Armes"); JPanel Objets = new JPanel(); Objets.setLayout(new BoxLayout (Objets, BoxLayout.Y_AXIS)); Objets.setBorder(BorderFactory.createEmptyBorder(10, 5, 2, 5 )); // -- CONTENU FENETRE NEW ARME -- // CBanqueArmes TabArmes = new CBanqueArmes(); Vector <String> TabNomArme = new Vector <String> (); for (int i = 0; i < TabArmes.TabArmesCC.capacity(); ++i) TabNomArme.add(TabArmes.TabArmesCC.elementAt(i).NomArme); JList ListeArme = new JList (TabNomArme); ListeArme.setLayoutOrientation(JList.VERTICAL); ListeArme.setDragEnabled(false); ListeArme.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ListeArme.setSize(300, 200); JScrollPane PanneauListe = new JScrollPane(ListeArme, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); JButton OK = new JButton("Ok"); JButton Annuler = new JButton("Annuler"); Annuler.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub NewObj.dispose(); } });
Merci d'Avance, Bonne Soirée
A voir également:
- Java - NullPointerException
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
4 réponses
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)
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 !