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 :

[Débutant] Erreur "java.lang.NullPointerException"


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut [Débutant] Erreur "java.lang.NullPointerException"
    Bonjour,

    Je souhaite développer un jeu tel que :

    • Il y a deux joueurs et l'un deux doit capturer les billes de l'autre.
    • Il y a une méthode distribue_bille() qui permet au joueur de distribuer les billes et donc de se déplacer.
    • Il y a aussi une méthode capture_bille() qui permet de capturer les billes de l'autre.


    Le problème est que le Joueur arrive à distribuer les billes mais n'arrive pas à capturer les billes.

    Dans la méthode capture_bille() quand je place System.out.println("9") avant if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0)), 9 est affiché. Par contre, si je mets System.out.println("9") après if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0)), 9 n'est pas affiché.

    Comme si le problème résidait dans le if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0))

    Voici l'erreur que j'obtiens :
    Exception in thread "main" java.lang.NullPointerException
    at Joueur1.capture_bille(Joueur1.java:197)
    at Joueur1.distribue_bille(Joueur1.java:178)
    at Joueur1.distribue_bille(Joueur1.java:171)
    at Joueur1.distribue_bille(Joueur1.java:171)
    at Jeu.lance_jeu(Jeu.java:27)
    at Jeu.main(Jeu.java:113)
    Voici mon code
    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
    void capture_bille() {
        if ((8 <= numero_case) && (numero_case <= 15)) {
            // System.out.println("9");
            if ((Joueur2.cas[23 - numero_case].nombre_bille != 0) && (Joueur2.cas[numero_case - 8].nombre_bille != 0)) {
            //System.out.println("9");
                nombre_bille = Joueur2.cas[23 - numero_case].nombre_bille + Joueur2.cas[numero_case - 8].nombre_bille;
                System.out.print(nombre_bille);
                Joueur2.cas[23 - numero_case].nombre_bille = 0;
                Joueur2.cas[numero_case - 8].nombre_bille = 0;
     
                if (compteur != 0) {
                    Bille case_vide = getcase_vide();
                    numero_case = case_vide.getnumero_case();
     
                    distribue_bille();
                } else {
                    numero_case = temp;
                    distribue_bille();
                }
     
            }
        }
    }
    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
     
          void distribue_bille(){
     if ((0 <= numero_case) && (numero_case < 16)) {
     
            nombre_bille = cas[numero_case].nombre_bille;
     
            for (int i = numero_case + 1; i < numero_case + nombre_bille; i++) {
                cas[i].nombre_bille = cas[i].getnombre_bille() + 1;
            }
     
            cas[numero_case].nombre_bille = 0;
     
            if (cas[numero_case + nombre_bille].nombre_bille == 0) {
     
                cas[numero_case + nombre_bille + 1].nombre_bille = cas[numero_case + nombre_bille + 1].getnombre_bille() + 1;
     
                System.out.println("Le Joueur1 a fait Mador");
     
            } else {
     
                System.out.println("distribue");
     
                cas[numero_case + nombre_bille].nombre_bille = cas[numero_case + nombre_bille].getnombre_bille() + 1;
                numero_case = numero_case + nombre_bille;
     
                if ((0 <= numero_case) && (numero_case <= 8)) {
     
                    distribue_bille();
                    cas[numero_case].nombre_bille = 0;
     
                } else {
                    if (numero_case >= 8) {
     
                        temp = numero_case;
                        capture_bille();
     
                        System.out.println("capture");
                    }
                }
            }
        }
    Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Slt,

    Le NPE se situe à la ligne indiquée dans ta stacktrace, je pense que ta variable Joueur2 ou l'un de ces attributs est null.

    ++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Salut,
    Dans un premier temps,
    Essaie de mettre juste avant if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0)),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.out.println(nombre_bille);
    System.out.println(numero_case);
    Dans un deuxième temps,
    Essaie de mettre juste avant if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0)),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println(Joueur2.cas[23-numero_case].nombre_bille);
    System.out.println(nombre_bille);
    System.out.println(numero_case);
    Qu'est-ce que tu remarques?
    Donne nous les noms de tes classes et leurs variables.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 318
    Points
    8 318
    Billets dans le blog
    52
    Par défaut
    Note : Pensez à utilisé la balise code ou codeinline( [c] ) pour vos codes dans les postes.

    Sinon, avant de fait un accès de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Joueur2.cas[23-numero_case].nombre_bille
    Le plus sûr est d'avoir les tests suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(Joueur2 == null){
        System.out println("Joueur 2 est nul !")
        //TODO traiter le problème !
    }
    if(Joueur2.cas[23-numero_case]){
        System.out println("le cas "+(23-numero_case)+" existe pas pour le joueur 2 !")
        //TODO traiter le problème !
    }
    //Accès à Joueur2.cas[23-numero_case].nombre_bille
    Je trouve étrange ce test Joueur2.cas[23-numero_case].nombre_bille!=0 && Joueur2.cas[numero_case-8].nombre_bille!=0) . A quoi correspond les valeurs en dur 8 et 23 ?

    Cordialement,
    Patrick Kolodziejczyk.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Note : Pensez à utilisé la balise code ou codeinline( [c] ) pour vos codes dans les postes.

    Sinon, avant de fait un accès de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Joueur2.cas[23-numero_case].nombre_bille
    Le plus sûr est d'avoir les tests suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(Joueur2 == null){
        System.out println("Joueur 2 est nul !")
        //TODO traiter le problème !
    }
    if(Joueur2.cas[23-numero_case]){
        System.out println("le cas "+(23-numero_case)+" existe pas pour le joueur 2 !")
        //TODO traiter le problème !
    }
    //Accès à Joueur2.cas[23-numero_case].nombre_bille
    Je trouve étrange ce test Joueur2.cas[23-numero_case].nombre_bille!=0 && Joueur2.cas[numero_case-8].nombre_bille!=0) . A quoi correspond les valeurs en dur 8 et 23 ?

    Cordialement,
    Patrick Kolodziejczyk.

    En fait, il y a deux classes Joueur1 et Joueur2. Le Jeu est formé de 32 cases reparties en 4 lignes et 8 colonnes, donc chaque ligne est formée de 8 cases et chaque colonne est formée de 4 cases.
    Le Joueur1 utilise les cases de gauche vers la droite c0, c1, c2, c3, c4,c5,c6, c7 sur la première ligne et de droite vers la gauche c8,c9,c10,c11,c12,c13,c14,c15 sur la deuxième ligne.

    Le Joueur2 utilise les cases de droite vers la gauche c0, c1, c2, c3, c4,c5,c6, c7 sur la première ligne et de gauche vers la droite c8,c9,c10,c11,c12,c13,c14,c15 sur la deuxième ligne.

    Le Joueur1 ne peut capturer les billes du Joueur2 que si
    D'abord il est sur la deuxième ligne c'est-à-dire s'il est soit sur c8,c9,c10,c11,c12,c13,c14,c15
    Si le Joueur1 est par exemple en position c9. En face de cette case, il y a la case c14 du Joueur2 qui correspond donc à c(23-9). Derrière la case c14 du Joueur 2, il y a la case c1 du Joueur2 qui correspond à C(9-8).

    Et donc si le Joueur1 est dans une case de numero numer_case , en face on a la case c(23-numero_case) et derrière cette case, il y a la case c(numero_case-8).
    Et le Joueur1 ne peut capturer les billes que si les cases c(23-numero_case) et c(numero_case-8) contiennent des billes.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par Javamar Voir le message
    Salut,
    Dans un premier temps,
    Essaie de mettre juste avant if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0)),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.out.println(nombre_bille);
    System.out.println(numero_case);
    Dans un deuxième temps,
    Essaie de mettre juste avant if((Joueur2.cas[23-numero_case].nombre_bille!=0)&&(Joueur2.cas[numero_case-8].nombre_bille!=0)),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println(Joueur2.cas[23-numero_case].nombre_bille);
    System.out.println(nombre_bille);
    System.out.println(numero_case);
    Qu'est-ce que tu remarques?
    Donne nous les noms de tes classes et leurs variables.
    Quand j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println(nombre_bille);
    System.out.println(numero_case);
    Ca affiche le nombre de billes et le numero de case.

    Par contre quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println(Joueur2.cas[23-numero_case].nombre_bille);
    System.out.println(nombre_bille);
    System.out.println(numero_case);
    Il ne se passe rien.

    Pour les classes, j'ai la classe Joueur1, la classe Joueur2 et la classe Bille. Pour les variables de la classe Joueur1 et Joueur2, j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Bille[] cas;
        Bille[][] tab;
        int numero_case;
        int nombre_bille;
        int temp;
        int compteur;
    J'ai aussi la classe Bille qui a pour variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bille[][] tab;
        int nombre_bille;
        int numero_case;

    Je me pose une question. cas est un tableau. Etant donné que cas est une variable de la classe Joueur2, j'ai le droit de faire Joueur2.cas quand j'appelle cette variable d'une autre classe. Est ce que j'ai le droit de faire Joueur2.cas[i] quand j'appelle la case cas[i]?? étant donné que cas[i] n'est pas un attribut de la classe Joueur2.

  7. #7
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Slt,
    Tu ne peux pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Joueur2.cas[23-numero_case].nombre_bille
    vu que nombre_bille est un attribut de Joueur.class et non de Cas.class
    tu dois écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Joueur2.cas[23-numero_case]
    et Joueur2.nombre_bille
    ++

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Je complète que j'ai aussi la classe Bille qui a pour variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bille[][] tab;
        int nombre_bille;
        int numero_case;
    Pour répondre à fredou, c'est pour cette raison que j'écris cas[23-numero_case].nombre_bille car cas[23-numero_case] est un objet de la classe Bille.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Salut,
    vérifie les cases cas[23-numero_case] et cas[numero_case-8], je pense qu'elles sont null.
    regarde toutes les cases si elles sont non null.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Salut,
    Je pense que tu peux bien faire Joueur2.cas[23-numero_case].nombre_bille. Si tu hésites, tu n'as qu'a créer une méthode de la classe Joueur2, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int getcas( int i){
    Return cas[i].nombre_bille;
    }
    Et au final le problème revient au même...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Salut à tous,
    Merci à tous!
    Effectivement, comme tu l'as dit Javamar, cas[23-numero_case] et cas[numero_case-8] étaient null.

    si cas est un tableau et une variable de la classe Joueur2, j'ai le droit de faire Joueur2.cas quand j'appelle cette variable d'une autre classe. J'ai aussi le droit de faire Joueur2.cas[i] quand j'appelle la case cas[i] d'une autre classe quelque soit la nature de l'objet cas[i].
    Le problème est résolu.

  12. #12
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 318
    Points
    8 318
    Billets dans le blog
    52
    Par défaut
    Tu as un bouton Résolu en bas de la discutions à utiliser pour tagger celle-ci comme résolu.
    Pense à l'utiliser !

    Cordialement,
    Patrick Kolodziejczyk.

    Edit : Bon ba c'est fait =)

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Tu as un bouton Résolu en bas de la discutions à utiliser pour tagger celle-ci comme résolu.
    Pense à l'utiliser !

    Cordialement,
    Patrick Kolodziejczyk.

    Edit : Bon ba c'est fait =)
    Merci Kolodz! c'est déjà fait!

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 31/05/2011, 10h40
  2. erreur compilation java.lang.NullPointerException
    Par muslim1987 dans le forum JDBC
    Réponses: 6
    Dernier message: 26/06/2008, 09h16
  3. Erreur exception java.lang.NullPointerException
    Par geol99 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2007, 20h24
  4. erreur de java.lang.NullPointerException
    Par vince351 dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2007, 12h29

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