Java - NullPointerException

Résolu/Fermé
Hahuha - 28 sept. 2011 à 20:06
 Hahuha - 28 sept. 2011 à 23:16
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 :

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:

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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.

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
0
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

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)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
28 sept. 2011 à 22:53
Ces deux codes sont équivalents :

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());
0
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 !
0