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

Langage Java Discussion :

Un NullPointerException mais pourquoi ?


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut Un NullPointerException mais pourquoi ?
    Bonjour !


    Dans le cadre de mes cours, je dois créer une classe permettant de charger/enregistrer des images aux format PPM. Jusque là pas trop dramatique mais j'ai une erreur que je ne m'explique pas.

    Dans mon code (plus bas), je créé un tableau de tableau à partir d'une classe Pixels présente dans mon fichier mais lors de l'accés au tableau pour le remplir je reçois une belle erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    chouette2.ppm
    P3
    # CREATOR: XV Version 3.10a  Rev: 12/29/94 (PNG patch 1.2)
    170 115
    255
    Exception in thread "main" java.lang.NullPointerException
            at Image.readFile(Ppm.java:93)
            at Ppm.main(Ppm.java:126)
    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
    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
    /*
     * Code pour le TP des cours de TDAI du CNAM : TP_004
     *
     * Classe representant une image au format PPM avec ses methodes
     * de lecture et ecriture de fichier dans ce meme format.
     */
     
    import java.io.*;
     
     
    class Pixels {
     
       short r;
       short g;
       short b;
     
    }
     
     
    class Image {
     
       /*
        * Donnees contenues dans un fichier PPM.
        */
       String filename;
       String header;
       String comments;
     
       short width;
       short height;
       short bpp;
     
       Pixels [][] px;
     
     
       /*
        * Methode statique de lecture d'un fichier au format PPM.
        * Cette methode cree et renvoie egalement un objet de type Ppm.
        */
       public void readFile (String filename) {
    	  int i = 0;
    	  int j = 0;
    	  int k = 0;
     
          String str;
          String [] parts;
     
     
          this.filename = filename;
     
          try {
             FileReader fr = new FileReader (filename);
             BufferedReader br = new BufferedReader (fr);
     
     
             /*
              * Donnes de l'entete du fichier PPM.
              */
             this.filename = filename;
             System.out.println(filename);
             this.header = br.readLine ();
             System.out.println(this.header);
             this.comments = br.readLine ();
             System.out.println(this.comments);
     
             str = br.readLine ();
             parts = str.split (" ");
             this.width = Short.parseShort (parts [0]);
             System.out.print(this.width + " ");
             this.height = Short.parseShort (parts [1]);
             System.out.println(this.height);
     
             str = br.readLine ();
             this.bpp = Short.parseShort (str);
             System.out.println(this.bpp);
     
             this.px = new Pixels [this.height][this.width];
     
     
             /*
              * Lecture de tous les pixels de l'images et remplissage
              * du tableau de pixels 'ppm.px'.
              */
             str = br.readLine();
             parts = str.split (" ");
             while (str != null) {
            	 if (j >= this.width) {
            		 i++;
            		 j = 0;
            	 }
     
            	 while (k < parts.length) {
            	    /*
            	     * ERREUR A PARTIR D'ICI !
                  */
            		 this.px[i][j].r = Short.parseShort(parts[k++]);
            		 System.out.print(this.px[i][j].r + " ");
            		 this.px[i][j].g = Short.parseShort(parts[k++]);
            		 System.out.print(this.px[i][j].g + " ");
            		 this.px[i][j].b = Short.parseShort(parts[k++]);
            		 System.out.print(this.px[i][j].b);
            	 }
            	 System.out.println(" ");
            	 k = 0;
     
            	 j++;
            	 str = br.readLine();
            	 parts = str.split (" ");
             }
     
     
             br.close ();
          }
          catch (IOException e) {
             System.out.println (
                "Erreur pendant le chargement du fichier : "
                + filename + " : " + e
             );
          }
       }
    }
     
     
    public class Ppm {
     
    	public static void main (String [] args) {
    		Image img = new Image();
     
    		img.readFile("chouette2.ppm");
    	}
     
    }

    Voilà, je ne demande que ca, pourquoi ?
    Merci bien
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Salut,

    while (k < parts.length) {
    this.px[i][j].r = Short.parseShort(parts[k++]);
    System.out.print(this.px[i][j].r + " ");
    this.px[i][j].g = Short.parseShort(parts[k++]);
    System.out.print(this.px[i][j].g + " ");
    this.px[i][j].b = Short.parseShort(parts[k++]);
    System.out.print(this.px[i][j].b);
    }
    tu fais 3 fois k++, c'est bizarre.
    si ta taille de parts vaut 2 au 3eme appel de parts[k], on a k = 2, et il sort du tableau.
    Ca semble risqué de loin, a moins d'etre sur que parts modulo 3 = 0

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par BainE
    tu fais 3 fois k++, c'est bizarre.
    si ta taille de parts vaut 2 au 3eme appel de parts[k], on a k = 2, et il sort du tableau.
    Ca semble risqué de loin, a moins d'etre sur que parts modulo 3 = 0
    Bin 3 fois oui mais c'est rien de bizzard, il faut quand même que j'avance dans le tableau sinon j'insère tout le temps la même valeur, ce qui n'est pas souhaitable, c'est comme si je le faisait après chaque action !

    Que tu fasses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.px[i][j].r = Short.parseShort(parts[k++]);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.px[i][j].r = Short.parseShort(parts[k]);
    k++;
    c'est franchement pareil !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (k < parts.length) {
       this.px[i][j].r = Short.parseShort(parts[k++]);
       System.out.print(this.px[i][j].r + " ");
       this.px[i][j].g = Short.parseShort(parts[k++]);
       System.out.print(this.px[i][j].g + " ");
       this.px[i][j].b = Short.parseShort(parts[k++]);
       System.out.print(this.px[i][j].b);
    }
    System.out.println(" ");
    k = 0;
    k étant le nombre de données dans le tableau après un split d'une chaîne de caractères et vallant zéro au départ, je ne vois pas le problème.

    A la sortie de la boucle la variable est remise à zéro. En fait, j'ai fait de cette manière car sur une seule ligne peut se trouver des données de plusieurs pixels donc j'ai trouvé cette solution assez simple et sans risque apparent vu que je test la valeur de k avec une condition à chaque tour de boucle.

    En utilisant k++ j'utilise d'abord la valeur puis j'incrémente, je vois pas où est le danger de dépassement !

    Mais le problème n'est pas là, le problème viens de l'accés au tableau soit:
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Bah, c'est normal, tu as juste initialisé px, mais il ne contient que des null, donc quand tu fais null.r, ça fait NullPointerException

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par ®om
    Bah, c'est normal, tu as juste initialisé px, mais il ne contient que des null, donc quand tu fais null.r, ça fait NullPointerException
    Heu comment on fait un tableau de tableau alors ? Moi je fait que du C à mes temps perdus (et j'en ai plein) donc bon, j'ai même pas 10h de codage en Java dans les dents
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Franck.H
    Heu comment on fait un tableau de tableau alors ? Moi je fait que du C à mes temps perdus (et j'en ai plein) donc bon, j'ai même pas 10h de codage en Java dans les dents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    this.px = new Pixels [this.height][this.width];
    //après avoir fait ça, il faut faire
    for(int i = 0, sizeI = tab.length; i < sizeI; i++)
        for(int j = 0, sizeJ = tab[0].length; j < sizeJ; j++)
            tab[i][j] = new Pixel();
            //tab[i][j] = new Pixel(r,g,b) si tu définis un constructeur
    Ta classe que tu appelles "Pixels", une instance représente UN pixel, donc elle ne devrait pas prendre de 's'... C'est un détail

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par ®om
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    this.px = new Pixels [this.height][this.width];
    //après avoir fait ça, il faut faire
    for(int i = 0, sizeI = tab.length; i < sizeI; i++)
        for(int j = 0, sizeJ = tab[0].length; j < sizeJ; j++)
            tab[i][j] = new Pixel();
            //tab[i][j] = new Pixel(r,g,b) si tu définis un constructeur
    Mouais, je comprend pourquoi j'ai jamais aimé ce langage

    Citation Envoyé par ®om
    Ta classe que tu appelles "Pixels", une instance représente UN pixel, donc elle ne devrait pas prendre de 's'... C'est un détail
    En fait dans une image il n'y a pas que 1 pixel


    Merci
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Franck.H
    En fait dans une image il n'y a pas que 1 pixel
    Certes, mais tu n'es pas dans ta classe Image, tu es dans ta classe Pixel !

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par ®om
    Certes, mais tu n'es pas dans ta classe Image, tu es dans ta classe Pixel !
    Mouais c'est sûr mais quand même, je ne m'arrête pas à ce genre de details entre mettre au pluriel ou au singulier, surtout que c'est un TP sans plus

    Si c'était un projet professionnel éventuellement mais là ...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. NullPointerException, Mais pourquoi ?
    Par toshiro92 dans le forum Android
    Réponses: 6
    Dernier message: 06/07/2011, 17h47
  2. mais pourquoi ce NullPointerException :/
    Par erox44 dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 29/04/2010, 11h07
  3. erreur LOOP attendu , mais pourquoi?
    Par ahage4x4 dans le forum ASP
    Réponses: 10
    Dernier message: 23/05/2005, 16h22
  4. Mais pourquoi ... Avec IE les tableaux sont décentrés ?
    Par nebule dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/11/2004, 10h04
  5. [Execution] qtintf70.dll Mais pourquoi?
    Par Pedro dans le forum EDI
    Réponses: 4
    Dernier message: 03/06/2004, 13h23

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