IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Problème java.lang.NullPointerException [Débutant(e)]


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Problème java.lang.NullPointerException
    Bonjour,

    je suis en train de faire un exercice, et je rencontre un problème de débutant (j'imagine), c'est pourquoi je sollicite votre aide pour m'aiguiller sur mon erreur.

    Je pense que le plus simple est que je vous donne le contenu de mes 3 classes... Si ça n'est pas le bon usage veuillez m'en excuser d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package data;
     
    import java.util.ArrayList;
     
    public class Cours {
    	private int annee;
    	private String nom;
    	private int nbHeures;
    	private ArrayList<Eleve> listeEleve;
     
    	public Cours(int annee, String nom, int nbHeures) {
    		super();
    		this.annee = annee;
    		this.nom = nom;
    		this.nbHeures = nbHeures;
    	}
    	public int getAnnee() {
    		return annee;
    	}
    	public String getNom() {
    		return nom;
    	}
    	public int getNbHeures() {
    		return nbHeures;
    	}
     
    	public void ajouterEleve(Eleve unEleve){
    		this.listeEleve.add(unEleve);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package data;
     
    public class Eleve {
    	private String nom;
    	private String prenom;
    	private int age;
    	private int annee;
     
    	public Eleve(String nom, String prenom, int age, int annee) {
    		super();
    		this.nom = nom;
    		this.prenom = prenom;
    		this.age = age;
    		this.annee = annee;
    	}
    	public String getNom() {
    		return nom;
    	}
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    	public String getPrenom() {
    		return prenom;
    	}
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public int getAnnee() {
    		return annee;
    	}
    	public void setAnnee(int annee) {
    		this.annee = annee;
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package data;
     
    import java.util.ArrayList;
     
    public class application {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		ArrayList<Cours> lesCours = new ArrayList<Cours>();
    		ArrayList<Eleve> lesEleves = new ArrayList<Eleve>();
     
    		Cours unCours;
    		unCours = new Cours(1, "cp", 28);
    		lesCours.add(unCours);
    		unCours = new Cours(2, "ce1", 30);
    		lesCours.add(unCours);
    		unCours = new Cours(3, "ce2", 30);
    		lesCours.add(unCours);
    		unCours = new Cours(4, "cm1", 32);
    		lesCours.add(unCours);
    		unCours = new Cours(5, "cm2", 32);
    		lesCours.add(unCours);
     
    		Eleve unEleve;
    		unEleve = new Eleve("Roze", "Nicolas", 6, 1);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Jouvin", "Théodore", 7, 1);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Grenier", "Edouard", 6, 1);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Raymond", "Artur", 6, 1);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Tessier", "Benjamin", 5, 1);
    		lesEleves.add(unEleve);
     
    		unEleve = new Eleve("Charbonnier", "Gaétan", 7, 2);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Brun", "Emilien", 7, 2);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Desbois", "Emile", 8, 2);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Chatal", "Florentin", 8, 2);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Marchand", "Jean", 7, 2);
    		lesEleves.add(unEleve);
     
    		unEleve = new Eleve("Pierpont", "Gustave", 8, 3);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Saint-Simon", "Louis", 9, 3);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Grenier", "Joel", 8, 3);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Roussel", "Noel", 8, 3);
    		lesEleves.add(unEleve);
     
    		unEleve = new Eleve("Dupré", "Gildas", 9, 4);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Lalande", "Guillaume", 9, 4);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Leblanc", "Gabriel", 9, 4);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Lalande", "Marius", 9, 4);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Rodier", "Etienne", 9, 4);
    		lesEleves.add(unEleve);
     
    		unEleve = new Eleve("Pelletier", "Victor", 10, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Petit", "Léon", 10, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Poincaré", "Joseph-Marie", 11, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Thévenet", "Arsène", 10, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Chrétien", "Emmanuel", 9, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Taillefer", "Edouard", 8, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Chénier", "Dimitri", 10, 5);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Tirmont", "Paul", 10, 5);
    		lesEleves.add(unEleve);
     
    		for (int i = 0; i < lesCours.size(); i++) {
    			for (int j = 0; j < lesEleves.size(); j++) {
    				if (lesCours.get(i).getAnnee() == lesEleves.get(j).getAnnee()) {
    					lesCours.get(i).ajouterEleve(lesEleves.get(j));
    				}
    			}
    		}
    	}
    }
    le problème survient au moment où j'appelle ajouterEleve pour ajouter un élève dans un cours.
    Je précise juste que les attributs sont ceux demandés dans l'énoncé de l'exercice.

    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Je précise également que j'ai plus ou moins compris la raison du bug (instanciation d'un objet null), mais que je n'ai pas compris comment le résoudre pour garder une structure similaire...

    merci

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Quand on débute, le plus simple est d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(monObjet == null) {
      System.out.println("Object monObjet est null");
    } else {
      System.out.println("Object monObjet n'est pas null. toString() : " + monObjet.toString());
    }
    sur tous les objets suspects d'être nulls au moment où l'erreur arrive.

    Citation Envoyé par ThE BiShOp* Voir le message
    Je précise également que j'ai plus ou moins compris la raison du bug (instanciation d'un objet null)
    Sauf que instanciation d'un objet null, ça ne veut rien dire... J'ai pas l'impression que tu aies compris quoi que ce soit, avec cette description.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		Eleve unEleve;
    		unEleve = new Eleve("Roze", "Nicolas", 6, 1);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Jouvin", "Théodore", 7, 1);
    		lesEleves.add(unEleve);
    La variable unEleve ne sert à rien, tu peux aussi bien faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		lesEleves.add (new Eleve ("Roze",   "Nicolas",    6, 1));
    		lesEleves.add (new Eleve ("Jouvin", "Théodore", 7, 1));
    Le code est plus simple, et la consommation de ressources est inférieure.

    En revanche,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		for (int i = 0; i < lesCours.size(); i++) {
    			for (int j = 0; j < lesEleves.size(); j++) {
    				if (lesCours.get(i).getAnnee() == lesEleves.get(j).getAnnee()) {
    					lesCours.get(i).ajouterEleve(lesEleves.get(j));
    				}
    			}
    		}
    Là tu fais deux appels à lesCours.get(i), il vaudrait mieux avoir "cours=lesCours.get(i)", afin d'éviter un appel à une méthode dont on ne sait pas quelle quantité de ressources elle consomme.

    Mais en fait, ce i et ce j ne te servent à rien... le mieux serait donc en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		for (Cours cours : lesCours) 
    			for (Eleve eleve : lesEleves) 
    				if (cours.getAnnee() == eleve.getAnnee()) 
    					cours.ajouterEleve(eleve);
    Plus court, plus simple, plus performant. Bon, après, pour les getters, personnellement je préfère souvent un accès direct, pour les mêmes raisons (contrôle des ressources, simplicité du code), mais c'est moins académique, semble-t-il.

    Mais pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		for (Cours cours : lesCours) 
    			for (Eleve eleve : lesEleves) 
    				if (cours.annee == eleve.annee) 
    					cours.ajouterEleve(eleve);
    est encore plus simple et plus performant.

    Sinon, pour ton erreur, je ne sais pas mais bon en principe, il suffit de repérer qui est null pour trouver ; c'est assez facile avec un debugger.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par JoeChip Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		Eleve unEleve;
    		unEleve = new Eleve("Roze", "Nicolas", 6, 1);
    		lesEleves.add(unEleve);
    		unEleve = new Eleve("Jouvin", "Théodore", 7, 1);
    		lesEleves.add(unEleve);
    La variable unEleve ne sert à rien, tu peux aussi bien faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		lesEleves.add (new Eleve ("Roze",   "Nicolas",    6, 1));
    		lesEleves.add (new Eleve ("Jouvin", "Théodore", 7, 1));
    Le code est plus simple, et la consommation de ressources est inférieure.
    Le code est plus simple, et donc, évite des étourderies qui consommeraient plus de ressource. Mais en l'état, la consommation de ressource est la même.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    la consommation de ressource est la même
    Ah bon ?? mais dans le premier cas on prend de la place sur le tas, donc il y a consommation du GC, dans l'autre on l'utilise que la pile, non ? En plus il y a au moins une assignation de plus, non ? Enfin, je ne sais pas, mais au pif on dirait, quoi.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par JoeChip Voir le message
    Ah bon ?? mais dans le premier cas on prend de la place sur le tas, donc il y a consommation du GC, dans l'autre on l'utilise que la pile, non ?
    Non. Une variable locale utilise aussi la pile. Le tas, c'est là où sont stockés les objets instanciés, or déclarer quelque chose n'instancie rien du tout.

    Mais plus important, ces deux écritures ne sont que deux manières différentes de dire la même chose au compilateur.

    Il n'existe pas de différence entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Date maintenant = new Date();
    Sytem.out.println(maintenant);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new Date());
    Mis à part un peu de cosmétique dans le style de codage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    merci de vos réponses.
    D'après thelvin, j'ai rien compris du tout, c'est toujours bon à savoir.

    Pour ce qui est repérer l'objet null, il s'agit de ArrayList listeEleve dans la classe Cours, j'essaye de lui ajouter un objet Eleve alors que l'objet listeEleve est null, d'où l'erreur (j'ai compris là ?).
    En revanche je ne sais pas vraiment comment m'en dépatouiller.

    Pour ce qui est du conseil de JoeChip pour ecrire mon expression sous la forme :
    for (Cours cours : lesCours)
    je ne connais (pour l'instant) pas cette syntaxe.

    Merci pour vos réponses.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par ThE BiShOp* Voir le message
    Pour ce qui est repérer l'objet null, il s'agit de ArrayList listeEleve dans la classe Cours, j'essaye de lui ajouter un objet Eleve alors que l'objet listeEleve est null, d'où l'erreur (j'ai compris là ?).
    Absolument. Après je me demande si tu as compris pourquoi il est null, mais bon.

    Citation Envoyé par ThE BiShOp* Voir le message
    En revanche je ne sais pas vraiment comment m'en dépatouiller.
    Il faut faire en sorte que listeEleve ne soit pas null.
    Au plus tard, il faut le faire avant de s'en servir.
    Mais bon, ce serait mieux de le faire au moment où tu construis l'objet, après tout listeEleve tu vas t'en servir à un moment ou à un autre, ça ne sert à rien d'attendre pour le rendre prêt à servir. Le mieux étant de faire ça directement dans la déclaration de listeEleve : la ligne private ArrayList<Eleve> listeEleve; est un raccourci pour dire private ArrayList<Eleve> listeEleve = null;. Il faudrait autre chose que null.

    Citation Envoyé par ThE BiShOp* Voir le message
    Pour ce qui est du conseil de JoeChip pour ecrire mon expression sous la forme :
    for (Cours cours : lesCours)
    je ne connais (pour l'instant) pas cette syntaxe.
    Quand tu la connaîtras tu pourras plus t'en passer . Et elle est aussi plus efficace.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Bon, et bien un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeEleve = new ArrayList<Eleve>();
    dans le constructeur de ma classe Cours et le tour est joué.
    C'est bien ce que je pensais, erreur de débutant.

    J'ai essayé la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Cours cours : lesCours)
    et ça m'a en effet l'air très pratique.

    J'ai également remarqué que dans votre exemple, vous ne mettiez pas d'accolade, cette syntaxe est utilisable uniquement lorsqu'il n'y a qu'une seule instruction à "suivre" ou est-ce que c'est plus général ?

  11. #11
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Pour ce qui est du conseil de JoeChip pour ecrire mon expression sous la forme :
    for (Cours cours : lesCours)
    je ne connais (pour l'instant) pas cette syntaxe.
    Bon, ben tu la connais maintenant, non ?

    Ah, et aussi : est implicite ; même si tu ne l'écris pas, il est appellé.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Je la "connais", c'est beaucoup dire, mais je vois comment l'utiliser dans ce cas précis.

    Pour le super(); implicite, j'avais cru comprendre ça, c'est ok


    Et bien merci à vous de m'avoir éclairé de vos lumières !!

    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Problème java.lang.NullPointerException
    Par zikyoubi dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 14/08/2013, 14h53
  2. Problème java.lang.NullPointerException : null null
    Par info20111 dans le forum Général Java
    Réponses: 2
    Dernier message: 12/06/2013, 17h34
  3. [Eclipse 3.2.2] Problème java.lang.NullPointerException
    Par richard_sraing dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 01/03/2011, 16h51
  4. Problème "java.lang.NullPointerException"
    Par driz764 dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 22/10/2008, 18h33
  5. problème de java.lang.NullPointerException
    Par vince351 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/03/2007, 08h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo