[Resolu][Java] Un truc de débutant!

J’ai un problème sur un code (de débutant) sur du Java. Le code se compile mais un NullPointerException apparaît et je ne sais pas comment corriger le tir…

Je cherche à utiliser un TreeMap avec comme clé une chaîne de caractère et comme valeur un ArrayList d’entiers.
Le même programme tourne sans problème en utilisant cette fois un seul entier en valeur. L’ArrayList me permettant de stocker plus d’informations pour des méthodes supplémentaires : la fonction du code posant problème restant donc la même avec un entier ou un tableau d’entiers.

Voilà le suspect!

[code]class Lexique extends TreeMap<String,ArrayList>
{
protected String nom;

 public Lexique()
 {
	 TreeMap<String,ArrayList<Integer>> Lexique = new TreeMap<String,ArrayList<Integer>> ();
 }
 
public Lexique(String texte) throws IOException 
{
	Reader reader = new FileReader(texte+".txt");
	BufferedReader in = new BufferedReader(reader);
	String ligne = in.readLine();
	
	while (ligne != null)	
	{
		String delimiteurs = "/0123456789°~^%$£*-_=+|#'.,;:?!() {}[]`<>\"\t\\<>«»";
		StringTokenizer st = new StringTokenizer (ligne, delimiteurs);
		while (st.hasMoreTokens())	
		{
			String mot = st.nextToken();
			mot=mot.toLowerCase();
			
			if (containsKey(mot))
			{
				int k=this.get(mot).get(0);
				this.get(mot).set(0,k+1);
			}
			else
			{
				this.get(mot).add(0,1);															-> NullPointerException à cette ligne
			}
			
		}
		ligne = in.readLine();
	}
}

}[/code]

[edit] Changement de tag

A vu de nez, d’après ton commentaire, je dirais que ton ArrayList n’est pas crée d’où le NullPointerException.

Ya un truc qui me choque dans ton code, pourquoi t’encapsule pas la TreeMap plutôt ?

Je ne vois pas très bien pourquoi appeler le premier constructeur dans le second. Ça marchait bien sans l’appeler quand j’utilisais un seul entier.
J’utilise cette classe à partir d’un main, que voici :

public class Exec { public static void main(String[] argv) throws IOException { String fichier; fichier =(argv.length!=0)? argv[0]: "monFichier"; Lexique t1 = new Lexique(fichier); t1.sauv(); } }

Pour l’encapsulation, je n’y ai pas pensé (je débute).

Bon

1 - ton premier constructeur sert a rien, Il fait que creer un objet dans le vide.

2 - Le bon code

if (containsKey(mot))
{
int k=this.get(mot).get(0);
this.get(mot).set(0,k+1);
}
else
{
ArrayList list = new ArrayList();
this.put(mot, list);

                // ca initialize ton array List
     
                this.get(mot).add(0,1);                                                            -> NullPointerException à cette ligne
            }

Tu hérites du conteneur … mais faut le remplir correctement donc faire l’initialization des arraylist … elles vont pas se faire toute seules

Bon alors plusieurs problèmes dans ton code:

_ Dans ton cas il faut utiliser l’encapsulation et non pas l’héritage. Mais bon admettons que tu conserves l’héritage

public Lexique() { TreeMap<String,ArrayList<Integer>> Lexique = new TreeMap<String,ArrayList<Integer>> (); }

Ici tu déclare et instancie une variable ayant le même nom que ta classe mais qui existe nulle part or de la portée du constructeur. Je pense qu’il y a une mauvaise compréhension à ce niveau là.

if (containsKey(mot)) { int k=this.get(mot).get(0); this.get(mot).set(0,k+1); } else { this.get(mot).add(0,1); }

Tu as une exception car la Treemap ne contient pas le mot donc this.get(mot) renvoie null et tu fais donc un add(0,1) sur null. Il faut donc que tu rajoutes le mot dans ta map.

if (lexiqueMap.containsKey(mot)) { int k = this.get(mot).get(0); this.get(mot).set(0,k+1); } else { ArrayList<Integer> aList = new ArrayList<Integer>(); aList.add(0, 1); this.put(mot, aList); }

Tu ne devrais plus avoir d’exception à cet endroit là… Après j’y connais rien en Java donc si un pro passe par là.

Merci à tous, maintenant ça marche beaucoup mieux (et j’ai mieux compris comment ça marche).