pb dans un méthode / rapport avec une List / NullPointerException
Bonjour à tous,
Je vais essayer d'être clair, concis, complet.
J'ai 3 classes : Batiment / Module / Main
Un bâtiment contient des modules.
Préambule :
- J'ai crée un batiment (bat0)
- pour créer un module, je dois appeler la méthode "CreerEtAjouterNouveauModule(String nom)" car l'id du module dépendra du nombre de module déjà crée dans le batiment (et il le passe en paramètre)
- une fois le module crée, la méthode appelle "this.addModule(nouveauModule)"
Voici mon problème :
- lorsque cette dernière méthode tente :
this.listeDesModulesDuBatiment.add(moduleAAjouter);
cela indique cette erreur :
Code:
1 2 3 4 5
|
Exception in thread "main" java.lang.NullPointerException
at aaaProjetJAVA.Batiment.addModule(Batiment.java:123)
at aaaProjetJAVA.Batiment.CreerEtAjouterNouveauModule(Batiment.java:140)
at aaaProjetJAVA.Main.main(Main.java:41) |
Il s'agit bien, à priori, de cette ligne qui est en erreur car j'ai isolé le reste.
Je ne vois pas d'où cela peut venir...
Merci à ceux qui auront le courage de jeter un oeil... ;)
Classe en raccourci (les classes complètes à la fin)
Batiment:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
private List<Module> listeDesModulesDuBatiment;
private int nombreDeModules;
private void addModule(Module moduleAAjouter) {
if (moduleAAjouter != null) {
this.listeDesModulesDuBatiment.add(moduleAAjouter);
}
}
public void CreerEtAjouterNouveauModule(String nom){
int nbMod = this.getNombreDeModules();
Module nouveauModule = new Module(nbMod,nom);
this.addModule(nouveauModule);
System.out.println("Nouveau module id : " + nouveauModule.getIdModule() + " crée");
} |
Module :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
public class Module {
private String nomModule;
private int idModule;
// Constructeur
public Module(int id, String nom){
nomModule = nom;
idModule = id;
} |
Main :
Code:
1 2 3 4 5 6 7 8
|
// création d'un batiment
Batiment bat0 = new Batiment("Batiment0");
// création d'un module
System.out.println("\n\n\nCréation d'un module pour le bâtiment : bat0");
bat0.CreerEtAjouterNouveauModule("Module0duBat0"); |
Classes complètes :
Batiment :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| package aaaProjetJAVA;
import java.util.*;
public class Batiment {
private static int nombreDeBatiment = 0;
private static List<Batiment> listeDesBatiments = new ArrayList<>();
private int idBatiment;
private String nomBatiment;
private List<Module> listeDesModulesDuBatiment;
private int nombreDeModules;
// Constructeur
public Batiment(String nom) {
idBatiment = Batiment.getNombreDeBatiment();
nomBatiment = nom;
nombreDeModules = 0;
List<Module> listeDesModulesDuBatiment = new ArrayList<>();
// mise à jour des statiques dans le constructeur :
Batiment.setNombreDeBatiment(1);
Batiment.addBatiments(this);
}
// *********** méthode statique ***********
// get nombre de batiment
public static int getNombreDeBatiment() {
return nombreDeBatiment;
}
private static void setNombreDeBatiment(int nombreDeBatimentAAjouter) {
Batiment.nombreDeBatiment += nombreDeBatimentAAjouter;
}
// get Liste des Batiments
public static List<Batiment> getListeDesBatiments() {
return listeDesBatiments;
}
private static void addBatiments(Batiment batimentAAjouter) {
Batiment.listeDesBatiments.add(batimentAAjouter);
}
// destructeur de bâtiment
public static void detruireBatiment(Batiment batimentADetruire) {
if (listeDesBatiments.contains(batimentADetruire)) {
listeDesBatiments.remove(batimentADetruire);
Batiment.setNombreDeBatiment(-1);
}
}
// *********** méthode non statique ***********
// To String
@Override
public String toString() {
String texte = "\n";
if (listeDesBatiments == null) {
texte += "Il n'y a aucun bâtiment construit";
return texte;
} else {
texte += "Le bâtiment n°" + this.idBatiment + " se nomme " + this.nomBatiment;
texte += "\nIl possède " + this.nombreDeModules + " modules";
texte += "\nSes modules sont :";
if (this.nombreDeModules == 0) {
texte += "\nIl n'y a aucun module\n\n";
return texte;
} else {
for (int i = 0; i < nombreDeModules; i++) {
System.out.println("\n");
listeDesModulesDuBatiment.get(i).toString();
}
System.out.println("\nFin des modules\n\n");
return texte;
}
}
}
// Getters and Setters
// Get ID (SET id à la construction)
public int getIdBatiment() {
return idBatiment;
}
// Get et Set NOM
public String getNomBatiment() {
return nomBatiment;
}
public void setNomBatiment(String nomBatiment) {
this.nomBatiment = nomBatiment;
}
// nombreDeModule
private int getNombreDeModules() {
return nombreDeModules;
}
private void setNombreDeModules(int nombreDeModules) {
this.nombreDeModules += nombreDeModules;
}
// Liste des Modules
public List<Module> getListeDesModules() {
return listeDesModulesDuBatiment;
}
private void addModule(Module moduleAAjouter) {
if (moduleAAjouter != null) {
this.listeDesModulesDuBatiment.add(moduleAAjouter);
//this.setNombreDeModules(1);
}
}
public void retirerModule(Module moduleARetirer) {
if (listeDesModulesDuBatiment.contains(moduleARetirer)) {
listeDesModulesDuBatiment.remove(moduleARetirer);
nombreDeModules--;
}
}
public void CreerEtAjouterNouveauModule(String nom){
int nbMod = this.getNombreDeModules();
Module nouveauModule = new Module(nbMod,nom);
this.addModule(nouveauModule);
System.out.println("Nouveau module id : " + nouveauModule.getIdModule() + " crée");
}
} |
Module :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| package aaaProjetJAVA;
import java.util.ArrayList;
import java.util.List;
public class Module {
private String nomModule;
private int idModule;
List<Integer> listeDesIdDesModulesAtteignable;
private int nombreDeModuleAtteignable;
List<Deplacement> listeDesDeplacements;
// Constructeur
public Module(int id, String nom){
nomModule = nom;
idModule = id;
listeDesIdDesModulesAtteignable = new ArrayList<>();
nombreDeModuleAtteignable = 0;
listeDesDeplacements = new ArrayList<>();
}
// Getters et Setters
public String getNomModule() {
return nomModule;
}
public void setNomModule(String nomModule) {
this.nomModule = nomModule;
}
public List<Integer> getListeDesIdDesModulesAtteignable() {
return listeDesIdDesModulesAtteignable;
}
public int getNombreDeModuleAtteignable() {
return nombreDeModuleAtteignable;
}
public List<Deplacement> getListeDesDeplacement() {
return listeDesDeplacements;
}
/* AJOUTER UN DEPLACEMENT POSSIBLE
public void addListeDesDeplacement(List<Deplacement> listeDesDeplacement) {
this.listeDesDeplacement = listeDesDeplacement;
}
*/
/* AJOUTER UN MODULE ATTEIGNABLE
public void setListeDesIdDesModulesAtteignable(List<Integer> listeDesIdDesModulesAtteignable) {
this.listeDesIdDesModulesAtteignable = listeDesIdDesModulesAtteignable;
}
*/
public int getIdModule() {
return idModule;
}
@Override
public String toString (){
String texte = "\n";
texte += "Le module n°" + this.getIdModule() + " se nomme " + this.getNomModule();
texte += "\nIl y a " + this.getNombreDeModuleAtteignable() + " modules atteignables à partir de cette position";
texte += "\nLes modules atteignables sont :";
if (this.getNombreDeModuleAtteignable() == 0) {
texte += "\nIl n'y a aucun module atteignable\n\n";
return texte;
} else {
for (int i = 0; i < this.getNombreDeModuleAtteignable(); i++) {
System.out.println("\n");
this.getListeDesIdDesModulesAtteignable().get(i).toString();
}
System.out.println("\nFin des modules Atteignables\n\n");
return texte;
}
}
} |
Main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
package aaaProjetJAVA;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("\nNombre de batiment construit : " + Batiment.getNombreDeBatiment());
System.out.println("Liste des batiments construit : ");
if (Batiment.getListeDesBatiments().isEmpty()) {
System.out.println("Il n'y a aucun bâtiment construit");
} else {
System.out.println(Batiment.getListeDesBatiments().toString());
}
System.out.println("\n\nConstruction de deux bâtiments ....\n\n");
Batiment bat0 = new Batiment("Batiment0");
Batiment bat1 = new Batiment("Batiment1");
System.out.println("\nNombre de batiment construit : " + Batiment.getNombreDeBatiment());
System.out.println("Liste des batiments construit : ");
if (Batiment.getListeDesBatiments().isEmpty()) {
System.out.println("Il n'y a aucun bâtiment construit");
} else {
for (int i = 0; i < Batiment.getNombreDeBatiment(); i++) {
System.out.println(Batiment.getListeDesBatiments().get(i).toString());
}
}
// création d'un module
System.out.println("\n\n\nCréation d'un module pour le bâtiment : bat0");
bat0.CreerEtAjouterNouveauModule("Module0duBat0");
//System.out.println(bat0.getListeDesModules());
} // accolade de fin du main
} |
Trouvé : j'étais con ;) (pb d'initialisation ArrayList répété à la déclaration ET à l'initialisation
Il fallait évidemment supprimer le "ArrayList<Module> dans le constructeur puisque la déclaration était déjà faite !
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class Batiment {
private static int nombreDeBatiment = 0;
private static List<Batiment> listeDesBatiments = new ArrayList<>();
private int idBatiment;
private String nomBatiment;
private ArrayList<Module> listeDesModulesDuBatiment;
private int nombreDeModules;
// Constructeur
public Batiment(String nom) {
idBatiment = Batiment.getNombreDeBatiment();
nomBatiment = nom;
nombreDeModules = 0;
ArrayList<Module> listeDesModulesDuBatiment = new ArrayList<>();
// mise à jour des statiques dans le constructeur :
Batiment.setNombreDeBatiment(1);
Batiment.addBatiments(this);
} |