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. #21
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Citation Envoyé par Tasumy Voir le message
    Qu'est-ce qui ne fonctionne pas?
    Tu as toujours l'erreur "NullpointerException"?
    Oui, j'ai toujours cette Exception. c'est au niveau de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MaClasse1 {......
    public void Calcul() throws Exception {....
    if (mot != null)
    {for (int i = 0; i < mot.getClientNbr(); i++)....} 
    }
    c'est aussi au niveau du Main de cette classe1:
    MaClasse1 obj = new MaClasse1();
    obj.Calcul();
    et également au niveau de MaClasse2 : ligne de la méthode "getClientNbr" (je l'ai posté dans mon message précédent)..
    Merci.

  2. #22
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    également au niveau de MaClasse2 : ligne de la méthode "getClientNbr"
    Ca viendrait de cette méthode donc, c'est à quelle ligne?
    Sinon, tu peux poster l'erreur en entier s'il te plaît?

  3. #23
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Citation Envoyé par Tasumy Voir le message
    Ca viendrait de cette méthode donc, c'est à quelle ligne?
    Sinon, tu peux poster l'erreur en entier s'il te plaît?
    Exception in thread "main" java.lang.NullPointerException:
    at MaClasse1.main (ligne: obj.Calcul()
    at MaClasse2.getClientNbr (ligne: for (int[]DataLine : data ))

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Par défaut
    data ne serait-il pas null ?

  5. #25
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    pourquoi tu ne deboggue pas ton code step by step?

  6. #26
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    Apparemment, ce serait ton data qui serait null.
    Fais-nous voir comment il est déclaré et instancié.

  7. #27
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    oui ton data il est instancie mais il est vide je crois.

    Cheers,

  8. #28
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    je pense que vous avez raison, c'est data qui est certainement null.

    Dans MaClasse2 {
    int [][]data = 0;
    .....

    et dans la méthode:
    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
     
    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;
    	    }
    je dois l'instancier au niveau de cette méthode?
    je peux faire comment si je veux récupérer vers "data", les éléments de "list" qui est dans le return de la méthode ParseFile de MaClasse2?

    Merci bcp pour votre aide.

  9. #29
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Pardon, je rectifie la déclaration de data dans MaClasse2:
    public int [][] data;

  10. #30
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    je dois l'instancier au niveau de cette méthode?
    Oui tu peux.
    Mais, étant donné que tu l'as déclaré en attribut, je suppose que tu dois l'utiliser autre part et donc le mieux est de l'instancier dès sa première utilisation une fois pour toute.

    je peux faire comment si je veux récupérer vers "data", les éléments de "list" qui est dans le return de la méthode ParseFile de MaClasse2?
    comme data vient de la classe MaClasse2 :
    Bien sûr, il faut que ta méthode ParseFile retourne un "int [][]".

    [EDIT]
    oui ton data, il est instancié mais il est vide je crois.
    non justement, ça ne provoquerait pas de NullPointerException s'il était instancié et vide.

  11. #31
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Citation Envoyé par Tasumy Voir le message
    Oui tu peux.
    Mais, étant donné que tu l'as déclaré en attribut, je suppose que tu dois l'utiliser autre part et donc le mieux est de l'instancier dès sa première utilisation une fois pour toute.
    comme data vient de la classe MaClasse2 :
    Bien sûr, il faut que ta méthode ParseFile retourne un "int [][]".

    [EDIT]
    non justement, ça ne provoquerait pas de NullPointerException s'il était instancié et vide.
    j'ai instancié data comme tu m'as dis :data = ParseFile() au niveau de getClientNbr, mais comme ParseFile retournait un résultat de type ArrayList, je suis entrain de le modifier:
    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
     
    public int [][] ParseFile() throws IOException
     
    	      {
     
    		 BufferedReader reader = new BufferedReader(new FileReader("C:file.txt"));
     
    		  String line = null;
    		  int [][]items;
    		  StringTokenizer splitter;
    		  while ((line = reader.readLine()) != null) 
    		  {
     
    		  for (String item : items) 
    		  {
    			  splitter = new StringTokenizer(item, " ");
    			  while (splitter.hasMoreTokens())
    			  	{
     Client = Integer.parseInt(splitter.nextToken());;
    		   Article = Integer.parseInt(splitter.nextToken());
    		   Prix = Integer.parseInt(splitter.nextToken());
     
    		   items.add(item);
     
    			  	}
     
    		  }
    		 }
    		  return items;	
      }
    j'ai toujours une erreur bien sûr concernant cette méthode, il y a un conflit entre String et int... Comment je pourrais utiliser à la fois StringTokenizer et retourner le résultat ss forme de int [][]?
    je sais que je pose trop de questions, mais c'est grace à vous que j'apprends des choses, merci

  12. #32
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int [][]items;
    ...
    for (String item : items)
    Je vois une erreur NullPointerException à ce niveau (items).

    Il y a quelque chose que je ne comprends pas :
    ParseFile retournait un résultat de type ArrayList<String>=> dimension : 1
    Mais maintenant, ParseFile retourne un résultat de type int [][] => dimension : 2.

    Qu'est-ce que tu veux retourner exactement?
    Qu'est ce que tu veux mettre dans data exactement? Car j'ai l'impression que les types que tu utilises ne sont pas bons.

    je sais que je pose trop de questions
    non, non on est là pour y répondre.

  13. #33
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    En fait, je saivais bien qu'il y avait cette erreur à ce niveau du code, je l'ai posté qd même, même si j'étais entrain de le modifier..
    en fait dans ParseFile, je veux retourner un tableau int à 2 dimensions, une concernant ClientId et l'autre ArticleId. parceque j'ai besoin de réutiliser ce tableau par d'autres méthodes dans la classe.

  14. #34
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    Dans ce cas, je te déconseille le int[][] puisque tu ne connais pas la taille du tableau et te conseille d'utiliser un ArrayList<Achat> pour ton data.
    classe Achat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public class Achat
    	{
    		private int clientId;
    		private int articleId;
    		public Achat(int clientId, int articleId){
    			this.clientId = clientId;
    			this.articleId = articleId;
    		}
    		public int getClientId(){return clientId;}
    		public int getArticleId(){return articleId;}
    	}
    Dans MaClasse2:
    puis faire (où tu en as besoin) : ta méthode parseFile() :
    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
    public ArrayList<Achat> ParseFile() throws IOException
    {
    	BufferedReader reader = new BufferedReader(new FileReader("C:file.txt"));
             
    	String line;
    	ArrayList<Achat> items;
    	StringTokenizer splitter;
    	while ((line = reader.readLine()) != null) 
    	{
    		for (String item : items)
    		  {
    			 splitter = new StringTokenizer(item, " ");
    			  while (splitter.hasMoreTokens())
    			  	{
    				  Client = Integer.parseInt(splitter.nextToken());;
    				  Article = Integer.parseInt(splitter.nextToken());
    				  Prix = Integer.parseInt(splitter.nextToken());
    		      		  Achat unAchat = new Achat(Client,Article);
    
    				  items.add(unAchat);
    		   
    			  	}
    		  	  
    		  }
    		 }
    		  return items;	
      }
    Note: Ta boucle for(String item : items) ne te sert à rien.


    Pour accéder au clientID/articleID de data tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Achat unAchat = data.get(index);
    unAchat.getClientID();
    unAchat.getArticleId();
    Bien sûr, en faisant cela, il faut que tu modifies partout où tu as manipulé data.

  15. #35
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Par défaut
    J'ai lu en diagonal les messages et il y a des trucs qui me turlupine...

    1) Dans ParseFile() items est déclaré mais jamais alloué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<Achat> items = new ArrayList<Achat>();
    2) La boucle devrait alors s'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Achat achat:items){...}
    3) Mais çà ne marcherais PAS parcequ'elle est vide !
    Ce bloc for(Achat achat:items) ne sert à rien...
    Si chaque ligne lue est un achat, alors ce sont les lignes lues qu'il faut splitter (et pas les items).
    La liste des items c'est ton résultat.

    4) Si le but est de remplir cette liste avec les éléments "achats de clients"
    (ici les objets de type Achat) et si chaque achat est une ligne...
    tu devrais avoir un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    splitter = new StringTokenizer(line, " ");
    if (splitter.hasMoreTokens()) {
       client = Integer.parseInt(splitter.nextToken());;
       article = Integer.parseInt(splitter.nextToken());
       prix = Integer.parseInt(splitter.nextToken());	
       items.add(new Achat(client,article,prix));	      		 
    }
    5) Une autre remarque:
    Conventionellement (mais c'est important en JAVA) le nom des propriétés et des méthodes commencent par une lettre minuscule. Le nom des classes commencent par une lettre majuscule.
    On donc peu déclarer :

    Article article; /* ma variable "article" de classe "Article" */
    Article getArticle(){...}; /* getter de l'article */

    Mais JAMAIS l'inverse (les programmes deviennent illisibles)

  16. #36
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList<Achat> items = new ArrayList<Achat>();
    ...
    splitter = new StringTokenizer(line, " ");
    if (splitter.hasMoreTokens())
    ...
    Oui pardon, c'est du copier-coller un peu trop rapide.

    Ce bloc for(Achat achat:items) ne sert à rien...
    Note: Ta boucle for(String item : items) ne te sert à rien.
    Conventionellement (mais c'est important en JAVA) le nom des propriétés et des méthodes commencent par une lettre minuscule. Le nom des classes commencent par une lettre majuscule.
    Cette remarque lui a déjà été faite.

  17. #37
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Je viens de lire vos réponses, je vais tester ce que vous m'avez proposé, je vous dirai ce que ça donne
    Merci beaucoup pour votre aide

  18. #38
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Salut,
    j'ai modifié la classe Achat suivant vos conseils, pour la méthode ParseFile, c'est bon.
    maintenant quand je fais appel à ParseFile() à partir de la méthode getArticlesCount, j'ai une erreur. je veux récupérer le nbr total des articles achetés.
    voilà 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
     
    public class Achat
    {
    	private int clientId;
    	private int articleId;
    	private int prix;
    	ArrayList<Achat>  data;
    	public Achat(int clientId, int articleId, int prix)
    	{
    		this.clientId = clientId;
    		this.articleId = articleId;
    		this.prix = prix;
    	}
     
    	public Achat() {
     
    	}
     
    	public int getClientId(){return clientId;}
    	public int getArticleId(){return articleId;}
    	public int getPrix(){return prix;}
     
    	public ArrayList<Achat> ParseFile() throws IOException
    	{
    		BufferedReader reader = new BufferedReader(new FileReader("C:\file.txt"));
     
    		String line;
    		ArrayList<Achat> items = new ArrayList<Achat>();
    		StringTokenizer splitter;
    		while ((line = reader.readLine()) != null) 
    		{						  
    	splitter = new StringTokenizer(line, " ");
    	if (splitter.hasMoreTokens()) {
    				clientId = Integer.parseInt(splitter.nextToken());;
    				articleId = Integer.parseInt(splitter.nextToken());
    				prix = Integer.parseInt(splitter.nextToken());	
    				  items.add(new Achat(clientId,articleId,prix));     		 			  								}					
    		 }
    		return items;	  	  
    	}
     
     
    	public int getArticlesCount() {
    		//Achat test = new Achat();
    //Ici j'ai unhandled exception file IO Exception		
    data = ParseFile();
     
    		int TotalItems = 0;
    	       ArrayList <Integer> v = new ArrayList <Integer> ();
     
    	        for (int i = 0; i < data.size(); i++) 
    	        {	        
    	        		  v.add(i);
    	        		  TotalItems = Math.max(TotalItems,v.size());
    	       }
     
    	       return TotalItems;	   
     
    	  }	
    }

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Par défaut
    Bonjour,

    C'est cette ligne-là qui entraîne l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((line = reader.readLine()) != null)
    Je le sais car dans ton code seule cette méthode peut générer une IOException comme précisé dans la Javadoc

    Il faudrait donner la trace complète du message pour savoir plus précisemment ce qu'il en est.

  20. #40
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Remplace :
    Par :
    Ou encore mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:"+System.getProperty("path.separator")+"file.txt"

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