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 :

NULLPOINTEREXCEPTION dans la classe Groupe. impossibilité de trouver un tableau d'objets


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut NULLPOINTEREXCEPTION dans la classe Groupe. impossibilité de trouver un tableau d'objets
    Bonjour à tous,
    je rencontre un probleme dans mon programme. Lorsque je veux tester la classe GROUPE, la méthode toString me retourne un objet null et je n'arrive pas à cerner ou se trouve le problème.

    merci d'avance pour vos réponses.


    Classe groupe

    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
    public class Groupe {
    	//attributs	
    	private Etudiant tabEtud[];
    	private int nbEtudiant;
     
    	public Groupe() {
    		tabEtud= new Etudiant[24];
    	}
     
    	public void ajouter( Etudiant etud){
    		tabEtud[nbEtudiant]=etud;
    		nbEtudiant++;
    	}
     
    	public String toString(){
    		String mes="";
     
    		for(int i=0;i<tabEtud.length;i++){
    			mes+=tabEtud[i]+" ";
    		}
     
    		return mes;
    	}
     
    	public Etudiant getTabEtud(int i) {
    		return tabEtud[i];
    	}
     
    	public Etudiant[] getTabEtud(){
    		return tabEtud;
    	}
     
    	public void setTabEtud(Etudiant[] tabEtud) {
    		this.tabEtud = tabEtud;
    	}
     
    	public int getNbEtudiant() {
    		return nbEtudiant;
    	}
     
    	public void setNbEtudiant(int etudiant) {
    		this.nbEtudiant = etudiant;
    	}
     
    	public double meilleure(){
    		double max=0.;//moyenne plus éléve
     
    		for(int i=0;i<nbEtudiant;i++){
    			double val=this.tabEtud[i].getEvaluation().calculerMoyenne();
    			/*if(val>max){
    				max=val;
    			}*/
    			max= Math.max(max, val);
    		}
    		return max;
    	}
     
    	public double pire(){
    		double min=100.;//moyenne la plus basse
     
    		for(int i=0;i<nbEtudiant;i++){
    			double val=this.tabEtud[i].getEvaluation().calculerMoyenne();
    			/*if(val<min){
    				min=val;
    			}*/
    			min= Math.min(val, min);	
    		}
    		return min;
    	}
     
    	public int rechercher(String code){
    		Etudiant etud = new Etudiant(code,null,null);
    		return TabUtils.rechSequentielle(tabEtud, etud, nbEtudiant);
    	}
     
    	public void trier(){
    	 TabUtils.tri(tabEtud, nbEtudiant);
    	}
    }
    classe Etudiant

    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
    public class Etudiant {
    	private String code;
    	private String nom;
    	private Notes evaluation;
     
    	//constructeur avec paramètre
    	/**
             * 
             * @param code 
             * @param nom
             * @param eval
             */
    	public Etudiant(String code, String nom, String eval) {
    		/*setCode(code);*/this.code = code;
    		/*setNom(nom);*/this.nom = nom;
    		this.evaluation=new Notes(eval);
    	}
    	//constructeur par défaut
    	public Etudiant(){
    		this("0","inconnu","0");
     
    	}
    	public String getCode() {
    		return code;
    	}
     
    	public void setCode(String code) {
    		this.code = code;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public Notes getEvaluation() {
    		return evaluation;
    	}
     
    	public void setEvaluation(Notes evaluation) {
    		this.evaluation = evaluation;
    	}
    	/**
             * methode "message" qui affiche 
             * Echec si la moyenne de l'étudiant est en-dessous de 60
             * et réussite si c'est le contraire
             * @return
             */
    	public Message message(){
    		if(this.evaluation.calculerMoyenne()<60)
    			return Message.ECHEC;
     
    		else
    			return Message.REUSSITE;
    	}
     
    	public boolean equals(Etudiant autre){
    		boolean res=this.code.equals(autre.code);
    		return res;
     
    	}
     
    	public int compareTo(Etudiant autre){
    		int qqch= this.code.compareTo(autre.code);
    		return qqch;
     
    	}
     
    }
    Classe Notes
    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
     
    public class Notes {
    	//attribut
    	private double tabNotes[];
    	private int  nbNotes=0;
     
    	//constructeur
    	/**
             * 
             * @param tableau de notes
             */
    	public Notes(double[] tabNotes) {
    		this.tabNotes = tabNotes;
    		nbNotes=tabNotes.length;
    	}
    	//autre constructeur
    	public Notes(String sNotes){
    		//remplir tabNotes
    		remplirTableau(sNotes);
    		nbNotes=tabNotes.length;
     
    	}/**méthode d'affichage des notes
              *parcours le tableau de valeur créer
              *en paramètre dans les constructeurs
              **/
    	public String toString(){
    		String res="";
     
    		for(double note: tabNotes) 
    			res+=note+" ";
     
    		return res;
     
    	}
    	/**méthode pour calculer la moyenne*/
    	public double calculerMoyenne(){
    		double somme=0;
    		double moy=0;
    		for(double note: tabNotes){
    			somme+=note;
    		}
    		if(nbNotes!=0)	
    			moy= somme/nbNotes;
    		return moy;
    	}
     
    	public int getNbNotes() {
    		return nbNotes;
    	}
    	public void setNbNotes(int nbNotes) {
    		this.nbNotes = nbNotes;
    	}
    	public double getTabNotes(int i) {
    		return tabNotes[i];
    	}
     
    	public void setTabNotes(double notes,int i) {
    		this.tabNotes[i] = notes;
    	}
     
    	public void remplirTableau(String sNotes){
    		//System.out.println("Contenus snotes : " + sNotes);
    		String separe[]=sNotes.split("[, ]"); 
    		tabNotes= new double[separe.length];
    		for(int i=0;i<separe.length;i++){
    			tabNotes[i]=Double.parseDouble(separe[i]);
    		}
    	}
     
    }
    test de la classe groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                    Groupe gr = new Groupe();
     
    		Etudiant etud2 = new Etudiant("26161234", "Marc", "65 81 58 100 79");
    		gr.ajouter(etud2);
     
    		Etudiant etud=new Etudiant("24910003", "Pierre", "45 59 36 66");
    		gr.ajouter(etud);
     
     
    		//afficher le groupe d'étudiants
    		System.out.println("Groupe d'étudiants:\n" + gr.toString());

  2. #2
    Membre habitué Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 185
    Points
    185
    Par défaut
    Salut salut_tout_le_monde,

    Après avoir rapidement survolé ton code Java, je vois un point qui me semble être critique.
    Est-ce volontaire d'avoir créé un tableau d'étudiants plutôt qu'une liste ?
    Le problème est que l'espace mémoire d'un tableau doit être pré-alloué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Etudiant[] etudiants = new Etudiant[X];
    Si tu ne connais pas la taille de ton groupe, mieux vaut passer par une liste ou un vecteur.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est étonnant que tu aies une NullPointerException, ou alors elle n'est pas exactement à l'endroit que tu montres. Sauf si on utilise la méthode setTabEtud(Etudiant[] tabEtud), qui est une très mauvaise idée (on ne doit jamais permettre à une classe externe de manipuler directement une instance surlaquelle la cohérence de la classe repose). Il faudrait procéder par copie dans cette méthode éventuellement.

    Dans la méthode toString() de Groupe, ton problème est surtout que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public String toString(){
    		String mes="";
     
    		for(int i=0;i<tabEtud.length;i++){
    			mes+=tabEtud[i]+" ";
    		}
     
    		return mes;
    	}
    tu parcours le tableau en entier, alors que le nombre d'étudiants dans le tableau est géré par nbEtudiant.

    Donc il faudrait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public String toString(){
    		String mes="";
     
    		for(int i=0;i<nbEtudiant;i++){
    			mes+=tabEtud[i]+" ";
    		}
     
    		return mes;
    	}
    A ce sujet, il vaut mieux éviter de faire de la concaténation dans ce cas (boucle). Le problème est limité dans ton cas, puisque tu auras au maximum 24 étudiants, mais dans le cas général, ce genre de code va créer beaucoup d'objets pour rien, et consommer donc du temps et de la mémoire (même si tu ne risques pas l'outofmemory pour cette raison, à chaque fois qu'il faudra libérer tous ces objets créés inutilement, ça va consommer du temps). On procède plutôt avec un StringBuilder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public String toString(){
    		StringBuilder mes=new StringBuilder();;
     
    		for(int i=0;i<nbEtudian;i++){
    			mes.append(tabEtud[i]);
                            mes.append(' ');
    		}
     
    		return mes.toString();
    	}
    ou, pour éviter d'abord une espace supplémentaire surperflue en fin de chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public String toString(){
    		StringBuilder mes=new StringBuilder();;
     
    		for(int i=0;i<nbEtudiant;i++){
                            if ( mes.length()>0 ) mes.append(' ');
    			mes.append(tabEtud[i]);
    		}
     
    		return mes.toString();
    	}
    A noter qu'il existe aussi des outils dans Java pour construire facilement et proprement ce genre de choses (mais si tu es débutant et que tu apprends Java, tu n'as peut-être pas encore le droit de les utiliser). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public String toString(){
        return Arrays.stream(tabEtud) // on parcourt le tableau d'étudiants
                     .limit(nbEtudiant) // mais on se limite au nombre nbEtudiant
                     .map(Object::toString) // contrairement à un + ou un StringBuilder, un Etudiant ne se transforme pas en String, on le précise donc ici
                     .collect(Collectors.joining(" ")); // on les concatène tous entre eux avec une espace de séparation
    }

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bygui Voir le message
    Salut salut_tout_le_monde,

    Après avoir rapidement survolé ton code Java, je vois un point qui me semble être critique.
    Est-ce volontaire d'avoir créé un tableau d'étudiants plutôt qu'une liste ?
    Le problème est que l'espace mémoire d'un tableau doit être pré-alloué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Etudiant[] etudiants = new Etudiant[X];
    Si tu ne connais pas la taille de ton groupe, mieux vaut passer par une liste ou un vecteur.
    Bonjour et désolé pour cette réponse en retard

    Oui, c'est volontaire de créer un tableau d'étudiant et tu as raison en ce qui concerne que l'espace mémoire du tableau doit être pré-alloué sinon il y aura erreur lors de la compilation.D'ailleurs, j'ai réussi à me débloquer un peu grâce à ça

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci à ceux qui ont répondu

    J'ai réussi à résoudre mon problème. Dans la méthode toString() de la classe groupe, il fallait juste que je mette une condition "if" dans le "for" qui va tout betement faire en sorte que la boucle parcourt seulement le tableau d'étudiant si son contenu n'est pas null, soit comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for(int i=0;i<tabEtud.length;i++){
     if(tabEtud[i]!=null) mes+=tabEtud[i]+" ";
     }
    sans cette condition la boucle parcourt tous le tableau et tombe sur sur des index avec des valeurs nulles ce qui provoque l'erreur lors de la compilation.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 632
    Points
    21 632
    Par défaut
    Puisque tu as résolu ton problème, quelques remarques pour progresser :

    • NullPointerException est une Exception, qui fonctionne comme toutes les autres Exception. C'est une erreur qui arrête le traitement de ton programme jusqu'à ce qu'un catch() l'arrête. Quand tu vois le mot null écrit quelque part, ça ne veut pas dire qu'il y a eu une NullPointerException. Ça veut dire que le mot null est écrit quelque part. Par exemple je l'ai écrit plusieurs fois dans ce message et je t'assure que ce message ne provoque aucune NullPointerException. Ici ton problème, c'est que tu n'étais pas satisfait que le mot null s'affiche plusieurs fois alors que ce que tu voulais, c'était afficher des descriptions d'objet. Mais, cela n'a rien à voir avec des NullPointerException. Cela a à voir avec ne pas aimer afficher le mot null.
    • La compilation, c'est quelque chose qui se passe avant que ton programme ne démarre, et même avant que tu ne demandes à ce qu'il démarre. Le compilateur c'est un outil qui surveille ce que tu fais pendant que tu es en train de taper ton programme, et qui te signale quand ce que tu es en train d'écrire n'est pas du Java ou ne respecte pas les règles de Java, ce qui signifie que ça ne peut même pas faire un programme qui démarre puisque ça ne fait pas de programme du tout. Une erreur de compilation, c'est une erreur qui fait que le code que tu tapes ne représentes pas vraiment un programme parce qu'une machine ne sait pas comment faire un programme à partir de code qui ne respecte pas les règles. Bref, quand on a une erreur de compilation, le programme ne démarre pas, puisqu'il n'existe pas. Donc, si tu oublies de faire un new pour ton tableau, ce n'est pas une erreur de compilation, puisque le programme démarre et que c'est après son démarrage que tu obtiens une erreur. C'est une erreur d'exécution. Et bien entendu tu ne peux pas tomber sur des erreurs de compilation pendant que tu es en train d'exécuter une boucle, puisque tu es en pleine exécution. Si une erreur arrive à ce moment-là c'est une erreur d'exécution et pas de compilation. À noter que si le mot null apparaît, peut-être que ça ne te plaît pas et donc que c'est une erreur de programmation, parce que le programmeur a créé un programme qui ne fait pas ce qu'il avait en tête. Mais en principe, un mot qui s'affiche ce n'est pas une erreur à proprement parler. Toi tu ne le voulais pas, d'autres le voudraient peut-être.

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

Discussions similaires

  1. [MySQL] Impossibilité de trouver mes données dans ma base avec phpmyadmin
    Par Helec dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/09/2016, 11h26
  2. Réponses: 22
    Dernier message: 05/02/2013, 19h49
  3. Réponses: 12
    Dernier message: 25/04/2007, 11h36
  4. Réponses: 1
    Dernier message: 22/01/2007, 14h26
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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