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 :

[debutant] NullPointerException java


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut [debutant] NullPointerException java
    Bonjour,
    j'ai une NullPointerException que j'arrive pas à résoudre
    Auriez-vous une explication?
    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
     
    classe Maclasse1
    {....
     
    //méthode
    public test() {
    for (int i = 0; i < mot.getClientsCount(); i++) {....}
    }
    //"mot" est une instance d'une autre classe "MaClasse2"  qui contient la //méthode "getClientsCount" (je veux qu'elle me retourne le nombre total de //clients):
     
     public  int getClientsCount()
         {
          int TotalClients = 0;
          for (int[]dataLine : data )
          {
           if (dataLine[0] == Client) {
         for (int i=0; i < dataLine.length; i++)
             { TotalClients = dataLine[i];
             }
            }
             }
     
          return TotalClients;
         }
    data est "data = new int [items.size()][5];" que je crée à partir d'une méthode ParseFile (BuffereReader...) dans "MaClasse2"
    Dans la méthode du parse j'utilise cette boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List<String> items = new ArrayList<String>();
    for (String item : items) {
         splitter = new StringTokenizer(item, " " );
          int Client = Integer.parseInt(splitter.nextToken());;
         int Article = Integer.parseInt(splitter.nextToken());
         int Prix = Integer.parseInt(splitter.nextToken());
     while (splitter.hasMoreTokens())
    		   {items.add(item);}
    }

    Merci.

  2. #2
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    tu peux ajouter le stack trace et utilise les balise code stp?

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    pour le code c'est bien les balises: <code> et </code>? je les ai mis mais ça ne marche pas..
    Concernant l'exception:
    "Exception in thread "main" java.lang.NullPointerException"
    ça concerne les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < mot.getClientsCount(); i++)
    .....dans la classe "MaClasse1"

    et le main de cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void main(String[] args) throws Exception {
      new MaClasse1();
    }

  4. #4
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 140
    Points
    140
    Par défaut
    Bonjour,
    ton "mot" doit être nul. Comment l'instancies-tu?

    PS : pour les balises code c'est "[CODE]".

  5. #5
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Regarde ce que vaut mot.getClientsCount()
    et regarde ce que tu fais dans ta boucle for.
    Si tu essaye d'acceder a un objet dans un tableau qui est null tu as ta solution.

    Je ne sais pas comment tu code ni dans quel environnement mais si tu le peux utilise les points d'arrets et les fenetres qui te permettent de voir quels sont les valeurs de tes variables au fur et à mesure que ton programme se déroule. C'est assez simple alors de voir ce qui ne va pas.
    .-*K.E.U.B*-.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Je suis sur l'environnement Eclipse.
    Si j'ai compris, cette exception est dûe à un objet null qq part.
    "mot" est une instance de la classe "MaClasse2" qui intègre une méthode pour la lecture d'un fichier et la récupération de ses éléments(ClientId,ArticleId,Prix)

    for (int i = 0; i < mot.getClientsCount(); i++)....
    dans cette boucle, j'essaie de récupérer le nombre total des clients (à partir du fichier parsé) pour faire certains calculs statistiques après dans MaClasse2.

    Moi j'ai mis simplement dans "MaClasse1":

    private MaClasse2 mot;
    comment je pourrais l'instancier?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Points : 310
    Points
    310

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Pour avoir une instance de MaClasse2, il faut que quelque part tu aies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mot = new MaClasse2();
    Si tu n'as pas besoin de l'initialiser de manière spéciale, essaie d'ajouter la ligne ci-dessus dans le constructeur de MaClasse1

  9. #9
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Merci pour vos conseils, je viens d'instancier "mot", déja je n'ai plus l'exception"NullpointerException".
    Par contre après l'exécution, je n'ai aucun résultat affiché.
    le main de "MaClasse1":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public static void main(String[] args) throws Exception {
    		new MaClasse1();		}
    la méthode de calcul:
    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
     
    public void Calcul() throws Exception {
    		double somme = 0;
    		int cpt = 0;
     
    		for (int i = 0; i < mot.getClientsCount(); i++) {
    	...................
     
    				for (int j = 0; j < mot.getArticlesCount(); j++) {
    				int valeur = ParseData.getPrice(motif.getListProduct().get(i),
    						motif.getListClient().get(j));
     
    				..............
    					double RdPrice = mot.RdPrice(i, j);
     
    					somme += Math.abs(valeur - RdPrice);
    					cpt++;
    				}
    			}
    		}
     
    		System.out.println(somme / cpt);
    	}
    à votre avis, je dois pas garder "void" dans ma méthode pour que ça me retourne le résultat de ce calcul?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Points : 310
    Points
    310
    Par défaut
    Ca n'a rien à voir, ton System.out.println devrait avoir un effet.

    Par contre effectivement si tu veux pouvoir utiliser le résultat du calcul par la suite il peut-être intéressant de le retourner.

    Fais voir l'ensemble du code de la méthode histoire de vérifier tes accolades (j'en vois 3 fermantes et 2 ouvrantes là mais comme il n'y a pas tout...)

  11. #11
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 140
    Points
    140
    Par défaut
    Il faut appeler ta méthode Calcul() ( par contre, il vaut mieux commencer un nom de méthode par une minuscule => calcul() ) en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasse1 obj = new MaClasse1();		
    obj.calcul();

  12. #12
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Je viens d'instancier la classe et d'appeler la méthode de calcul, mais j'ai à nouveau l'erreur "NullpointerException"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static void main(String[] args) throws Exception {
    		MaClasse1 obj = new MaClasse1();		
    		obj.Calcul();
    			}
    cette exception concerne la ligne: "obj.Calcul();"
    et également la ligne de la boucle for de la méthode "Calcul":
    public void Calcul() {.........
    for (int i = 0; i < motif.getClientNrb(); i++) {....} que je vous ai posté tout à l'heure.

    Cette méthode est intégrée dans "MaClasse2" ss forme:
    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
     
     
    public  int getClientNbr()
    	    {
    	    	int TotalClients = 0;
    	    	for (int[]dataLine : data )
    	    	{
    	    		if (dataLine[1] == Client) {							
    					for (int i=0; i < dataLine.length; i++)
    		   				{ TotalClients = dataLine[i];
    		   				}
    						    										}
    }
     
    	    	return TotalClients;
    	    }
    data, je le récupère après la lecture du fichier dans MaClasse2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ........BufferReader.....
    data = new int [items.size()][5];
     
    		  for (String item : items) {
    		   splitter = new StringTokenizer(item, " ");
    		   while (splitter.hasMoreTokens())
    		   {		  
    		   items.add(item);
    		   }
    Merci pour votre aide.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Points : 310
    Points
    310
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < motif.getClientNrb(); i++)
    Es-tu certain que motif != null ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (dataLine[1] == Client)
    Es-tu certain que dataLine[1] existe i.e. que ton tableau contient au moins 2 éléments ? Je rappelle en effet que le 1er élément de dataLine c'est dataLine[0].

    Ce qui est difficile avec ton code, c'est que tu ne contrôles pas grand chose et que nous ne savons pas comment tu initialises tes variables, ni comment tu remplis tes tableaux.

  14. #14
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 140
    Points
    140
    Par défaut
    C'est quoi "motif"?
    Je pense que ton erreur est la même que pour "mot". Il est bien instancié?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Points : 310
    Points
    310
    Par défaut
    Pendant que j'y suis :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int getClientNbr() {
       int totalClients = 0; // 1ere lettre en minuscule
       for (int[]dataLine : data ) {
          if (dataLine[1] == client) { // idem			
             for (int i=0; i < dataLine.length; i++) { 
                //TotalClients = dataLine[i];
                totalClients = totalClients + dataLine[i]; // ou totalClients += dataLine[i] sinon tu ne fais qu'écraser la valeur précédente avec la valeur courante
             }
          }
       }
       return TotalClients;
    }

  16. #16
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Tasumy Voir le message
    C'est quoi "motif"?
    Je pense que ton erreur est la même que pour "mot". Il est bien instancié?
    c'était juste une faute de saisie, c'est plutôt "mot".
    je l'ai insatncié de cette façon:
    mot = new MaClasse2();
    Mais c'est dans les attributs de MaClasse1..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import Package.MaClasse2;
    .....
    public class MaClasse1 {
    ..........
    public MaClasse2 mot;
     
    public MaClasse1() {
     
    		mot= new MaClasse2();}
    je ne sais pas si c'est correct ce que j'ai fait..

  17. #17
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Benouze Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < motif.getClientNrb(); i++)
    Es-tu certain que motif != null ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (dataLine[1] == Client)
    Es-tu certain que dataLine[1] existe i.e. que ton tableau contient au moins 2 éléments ? Je rappelle en effet que le 1er élément de dataLine c'est dataLine[0].

    Ce qui est difficile avec ton code, c'est que tu ne contrôles pas grand chose et que nous ne savons pas comment tu initialises tes variables, ni comment tu remplis tes tableaux.
    Merci pour ta réponse.
    où est-ce que je dois vérifer que mot est non null?c'est dans MaClasse1?
    et comment je pourrais faire aussi pour dataLine[1]?

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Points : 310
    Points
    310
    Par défaut
    où est-ce que je dois vérifer que mot est non null ?
    Avant d'appeler la méthode getClientNrb().

    comment je pourrais faire aussi pour dataLine[1] ?
    Avant d'aller récupérer le deuxième élément tu vérifies que la taille du tableau est >= 2.

  19. #19
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Benouze Voir le message
    Avant d'appeler la méthode getClientNrb().



    Avant d'aller récupérer le deuxième élément tu vérifies que la taille du tableau est >= 2.
    Voilà ce que j'ai fait, mais qui ne fonctionne toujours pas:
    pour la méthode "getClientNbr" dans MaClasse2:
    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
     
     
    public  int getClientNbr()
    	    {	int ClientId = 0;
    	    	int TotalClients = 0;
     
    	    	for (int[]DataLine : data )
    	    	{
    	    		if (DataLine.length > 2)
    	    		{
    	    		DataLine[0] = ClientId;
     
    	    			{
    					for (int i=0; i < DataLine.length; i++)
    		   			{ TotalClients = TotalClients + DataLine[i];
     
    		   				}				
    	    										}
     
    	    	}
    	    	}
    	    	return TotalClients;
    	    }
    Dans MaClasse1, comme tu m'as dis, avant la boucle for, j'ai inséré:
    if (mot != null)
    {for (int i = 0; i < mot.getClientNbr(); i++)....}

    c'est bien ça?

  20. #20
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 140
    Points
    140
    Par défaut
    Qu'est-ce qui ne fonctionne pas?
    Tu as toujours l'erreur "NullpointerException"?

Discussions similaires

  1. [Debutant] erreur "java.lang.NullPointerException" android
    Par Pif_Paf_Pouf dans le forum Android
    Réponses: 6
    Dernier message: 21/05/2014, 21h50
  2. [DEBUTANT][DTD][JAVA]déclaration d'une DTD ("file: ....
    Par The Wretched dans le forum Valider
    Réponses: 2
    Dernier message: 21/06/2005, 09h57
  3. [debutant]MySql & Java
    Par Stef784ever dans le forum JDBC
    Réponses: 4
    Dernier message: 16/06/2004, 13h49
  4. [debutant]Servlet java
    Par Regis.C dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 14/05/2004, 11h28
  5. [debutant] correspondance JAVA C++ pour pointeur de fonction
    Par davidoff_tls dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2004, 10h13

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