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 :

retour erreur java.lang.NullPointerException


Sujet :

avec Java

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut retour erreur java.lang.NullPointerException
    Bonjour à tous,

    Je suis nouveau sur ce forum donc je me présente : je suis étudiant en 2 eme année de licence. Cette année j'apprends le java ... et mes premiers pas dans ce langage sont plutot difficiles ! Voilà pourquoi je viens vous demander de l'aide !

    e developpe sous eclipse, et lorsque je compile ma premier classe, je n'ai aucun message d'erreur. Et pour la classe test, voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.lang.NullPointerException
    	at Node.Prefixe(Node.java:31)
    	at Node.Prefixe(Node.java:32)
    	at Node.Prefixe(Node.java:32)
    	at Essai.main(Essai.java:18)
    Je ne comprends vraiment pas ... Quelqu'un pourrait m'aider ? Ai-je correctement crée mes classes ?

    Merci d'avance !

  2. #2
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Peut-tu nous dire ce qui se trouve à la ligne 18 de ta classe Essai et à la ligne 31 de ta classe Node ?

    Sinon fait attention à ta méthode getChildren(), si enfants == null elle renvoie une nouvelle Arraylist mais enfants reste non initialisé. Ce qui signifie que si tu souhaites y ré-accéder par la suite en utilisant getChildren() tu te retrouveras avec une nouvelle Arraylist.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Alors
    A la ligne 18 j'ai dans ma classe Essai j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Node> aha = arbre.Prefixe();
    A la ligne 31 de ma classe Node j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Node children :enfants){

  4. #4
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Citation Envoyé par krishna_ Voir le message
    Alors
    A la ligne 18 j'ai dans ma classe Essai j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Node> aha = arbre.Prefixe();
    A la ligne 31 de ma classe Node j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Node children :enfants){
    Donc celà signifie que sur au moins un de tes Nodes le membre "enfants" n'a pas été initialisé.

    A mon avis tu devrais l'initialiser dans ton premier constructeur (puisque pour le second tu fournis déjà une liste) ou alors corriger ta fonction getChildren() en tenant compte de ma remarque précédente et changer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (Node children :enfants){
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (Node children : getChildren()){
    Est-ce que tu comprend pourquoi ?

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je ne comprends pas pourquoi ce que j'avais fait ne fonctionnait pas ... Est ce parceque je n'avais pas initialisé "enfants" ? Mais si je comprends bien, la boucle for(={} avec getChildren() parcours l'ensemble des enfants du noeuds consideré, est ce bien cela ?

  6. #6
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Citation Envoyé par krishna_ Voir le message
    Est ce parceque je n'avais pas initialisé "enfants" ? Mais si je comprends bien, la boucle for(={} avec getChildren() parcours l'ensemble des enfants du noeuds consideré, est ce bien cela ?
    1) Tout à fait. Lorsque tu déclares un membre sans l'initialiser il vaut null. Une affectation avec new créé une instance et sauvegarde la référence (l'adresse mémoire) dans ta variable membre qui sait désormais comment accéder à ton objet nouvelle créé et dans ton membre ne vaut plus null.

    Ton erreur vient du fait que tu essayais de parcourir une liste qui n'existait pas.

    2) La boucle for étendue (celle que tu utilises) parcours tous les éléments d'une collection en effet. Mais ça tu devais le savoir puisque tu l'as codé, non ?
    Si tu laisses "enfants" tu cours le risque que le membre ne soit pas initialisé et dans ce cas la solution la plus sage aurait été de l'initialiser à la construction de l'objet dans ton constructeur. C'est ce qui est fait en général.

    Je n'ai aucune idée du nombre de noeuds dont tu vas avoir besoin mais construire une liste pour chaque noeud implique une plus grosse consommation mémoire que si tu créais une liste pour chaque noeud qui aurait réellement besoin d'enfants, c'est la raison pour laquelle tu peux déplacer l'initialisation dans la méthode getChildren() qui n'initialise qu'au besoin.

    Mais pour l'instant ta méthode getChildren() est foireuse, elle devrait plutôt ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<Node> getChildren() {
            if (this.enfants == null) {
                this.enfants =  new ArrayList<Node>();
            }
            return this.enfants;
        }
    Même question, est-ce que tu comprend pourquoi ?

  7. #7
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui c'est bien plus clair !

    Par contre, une autre question : si j'ai dans ma liste retour par exemple, Node@3e25a5, c'est l'adresse à laquelle se trouve la valeur de mon Noeu ? Cela vient du fait que je n'ai pas encore fait de methode toString() propre à ma classe ? Car là en fait j'utilise la methode toString de la classe Object() je comptais me pencher sur ma methode toString une fois mon programme sans erreur, ce qui est le cas grace a vous, encore un grand merci !

  8. #8
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Citation Envoyé par krishna_ Voir le message
    Oui c'est bien plus clair !

    Par contre, une autre question : si j'ai dans ma liste retour par exemple, Node@3e25a5, c'est l'adresse à laquelle se trouve la valeur de mon Noeu ? Cela vient du fait que je n'ai pas encore fait de methode toString() propre à ma classe ? Car là en fait j'utilise la methode toString de la classe Object() je comptais me pencher sur ma methode toString une fois mon programme sans erreur, ce qui est le cas grace a vous, encore un grand merci !
    Ce n'est pas l'adresse à proprement parler, disons plutôt que c'est un identifiant.
    Et en effet, si tu veux changer l'affichage tu dois redéfinir la méthode toString().

    N'oublie pas de marquer le sujet en résolu si c'est le cas

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

Discussions similaires

  1. Erreur java. lang.NullPointerException
    Par hicham.gi dans le forum Struts 1
    Réponses: 17
    Dernier message: 03/06/2009, 11h11
  2. Réponses: 0
    Dernier message: 26/12/2007, 17h28
  3. Réponses: 32
    Dernier message: 20/04/2007, 21h56
  4. [Débutant] Erreur java.lang.NullPointerException
    Par Kevin12 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/02/2007, 15h48
  5. Probleme erreur java.lang.NullPointerException
    Par Tsukaasa dans le forum Langage
    Réponses: 4
    Dernier message: 25/05/2006, 18h19

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