[JAVA] Vector + classes

Résolu/Fermé
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 - 27 févr. 2008 à 13:00
 Yukino - 14 janv. 2012 à 04:52
Bonjour,

Je débute en java et aurais besoin de votre aide =) !
J'ai un programme à réaliser qui consiste à avoir 2 classes : Eleve et FichierEleves.

Eleve contient le nom, prénom et une note + les méthodes suivantes : getNom(), getPrenom() et getNote() qui retourne chacun des attributs.
J'ai fait un main pour tester cette classe. Tout fonctionne sans problème.

FichierEleves, quant à elle, contient un vector<Eleve> ListeEleves, qui représente, comme vous l'aurez comrpis, une liste d'élèves. Elle possède également les méthodes suivantes : addEleve() et removeEleve() pour supprimer ou ajouter un élève.

Ma classe est donc codée comme ça :

*************************************************************************************
package fichierEleves;

import java.util.Vector;
import eleve.Eleve;

public class FichierEleves
{
Vector<Eleve> ListeEleves;


public Vector<Eleve> getListe()
{
return ListeEleves;
}

public void addEleve(Eleve e)
{
ListeEleves.add(e);
}

public void removeEleve(int index)
{
if(ListeEleves.isEmpty())
{
System.out.println("Aucun élève dans la liste.");
}
else
{
ListeEleves.removeElementAt(index);
System.out.println("Elève supprimé de la liste. ");
}
}
}
*************************************************************************************

J'ai fait un main pour tester cette classe qui est le suivant :


*************************************************************************************
package fichierEleves;

import eleve.Eleve;

public class MainFichierEleves {

public static void main(String[] args)
{
Eleve Eleve1;
Eleve Eleve2;
FichierEleves MonFichierEleve;

MonFichierEleve = new FichierEleves();
Eleve1 = new Eleve("Dupont","Julie",15);
Eleve2 = new Eleve("Martin","Antoine",16);

// Ajout des élèves
MonFichierEleve.addEleve(Eleve1);
MonFichierEleve.addEleve(Eleve2);

System.out.println("Mon fichier élèves après ajout : " + MonFichierEleve);

// Suppression des elèves
MonFichierEleve.removeEleve(1);
MonFichierEleve.removeEleve(2);

System.out.println("Mon fichier élèves après suppression : " + MonFichierEleve);
}
}
*************************************************************************************

Cependant, j'obtiens les erreurs suivantes :
"Exception in thread "main" java.lang.NullPointerException
at fichierEleves.FichierEleves.addEleve(FichierEleves.java:18)
at fichierEleves.MainFichierEleves.main(MainFichierEleves.java:18)"

Note : je travaille sous eclipse. !

Pourriez-vous m'aider à trouver mon/mes erreur(s) svp ?

Je souhaiterai afficher ce que contient la liste d'élève, mais je ne sais pas encore très bien comment tout cela fonctionne.
J'espère avoir été assez claire...

MERCI BEAUCOUP pour toute l'aide que vous pourriez m'apporter !

Bonne journée à tous !!
A voir également:

9 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
27 févr. 2008 à 13:27
Bonjour, ton erreur vient du fait que ton objet list n'as pas été instancié, donc est null. Du coup lorsque tu tente d'appeller une méthode depuis cet objet, l'objet étant null, cela renvoi une NullPointerException.

Ce qu'il faut que tu fasse : Créer un constructeur (comme dans toute classe qui se respecte) dans lequel tu instancie ta liste :
public FichierEleves ( ){
    ListeEleves = new Vector();
}

1
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
27 févr. 2008 à 13:37
Super ! Effectivement, ça marche maintenant !
Cependant, j'ai une autre petite erreur : voici ce que j'obtiens quand je compile :

***********************************************************************

Mon fichier élèves après ajout : fichierEleves.FichierEleves@45a877
Elève supprimé de la liste.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
at java.util.Vector.removeElementAt(Unknown Source)
at fichierEleves.FichierEleves.removeEleve(FichierEleves.java:34)
at fichierEleves.MainFichierEleves.main(MainFichierEleves.java:25)

***********************************************************************

Comment dois-je faire pour qu'il m'affiche mon vecteur (qu'il m'affiche tous les noms des élèves... avec prénoms et note) ? Y'a-t'il une fonction particulière dans vector ?

Encore merci beaucoup pour ton aide !
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
27 févr. 2008 à 13:41
Lorsque tu ajoute quelque chose dans un tableau, une liste, etc.. le premier indice est 0 et non 1.
Conclusion lorsque tu tente de supprimer après ton ajout, tu tape à l'indice 1 pour le premier, ce qui fonctionne puisque tu as enregistré deux utilisateurs (positions 0 et 1 respectivement), mais lorsque tu fais le deuxième delete, tu tape à la position 2, qui n'existe pas dans ta liste.

Il faut donc que tu refasse tes indices correctement comme suit :
MonFichierEleve.removeEleve(0);
MonFichierEleve.removeEleve(1); 

1
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
27 févr. 2008 à 14:00
Oui, c'est fait (je l'avais changé, j'ai oublié de le préciser...).
J'obtiens toujours la même erreur.

(encore merci beaucoup pour ton aide, c'est super gentil de te pencher sur mon problème !)
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
27 févr. 2008 à 14:14
Je suis sur pas certain mais il est possible que l'objet java "Vector" se réinitialise automatiquement. Donc quand tu supprime l'élément premier (position 0 dans ta liste), il ne reste plus qu'un seul objet dans ta liste au lieu de deux, et ce deuxième objet se "décale" donc d'un cran. Pour le coup la taille de ta liste est de 1, ce qui fait que lorsque tu tente de supprimer l'enregistrement deux, à la position 1, puisque ce dernière se situe maintenant à la position 0 (et que ta liste a une taille de 1 au lieu de 2), ca t'envoi une exception (1 >= 1 (taille liste))

Ce qu'il faut que tu fasse pour être sur que c'est bien là la raison, c'est de supprimer deux fois l'élément 0 (au lieu de 0 puis 1).
Si tout se passe bien c'est que c'est ça, auquel cas il faudra que tu revois ta manière de supprimer un élément de ta liste (non plus sur le numéro d'index, mais sur le nom de la personne par exemple)
1
Utilisateur anonyme
27 févr. 2008 à 14:25
Tu as tout à fait raison kij_82 : La classe Vector réorganise les indices du tableau lors de la suppression d'un élément comme le prouve la javadoc :

public void removeElementAt(int index)

Deletes the component at the specified index. Each component in this vector with an index greater or equal to the specified index is shifted downward to have an index one smaller than the value it had previously. The size of this vector is decreased by 1.
0
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
27 févr. 2008 à 14:50
SUPER ! C'est ça, merci beaucoup !!!

Bon, vous allez me trouver embêtante mais... j'ai toujours l'erreur suivante : quand je compile, j'obtiens le résultat suivant :

************************************************************
Mon fichier élèves après ajout : fichierEleves.FichierEleves@45a877
Elève supprimé de la liste.
Elève supprimé de la liste.
Mon fichier élèves après suppression : fichierEleves.FichierEleves@45a877
************************************************************

Lorque j'affiche mon vecteur avec System.out.println(Liste1); ça me marque "fichierEleves.FichierEleves@45a877" alors que je souhaiterai que ça me donne les noms, prénoms, notes des élèves compris dans le vecteur... comment cela se fait-il ? Y'a-t-il une fonction spécifique aux vecteurs afin de les afficher ?

(encore une fois, merci)
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
27 févr. 2008 à 14:55
C'est parce que tu donne à la méthode d'affichage un objet et non une "entité affichable" au sens où on l'entend. Du coup puisqu'il s'agit d'un objet, la méthode affiche la référence de l'objet et non ce que contient l'objet.
Comment veux-tu d'ailleurs que java sache à l'avance comment afficher ce que toi tu créer :)

Si tu souhaite afficher ta liste, il faut que tu développe ta propre méthode d'affichage :)

Ex de méthode :
public String displayList ( ){
    String toreturn = "";
    Eleve myEleve = null;
    for (int i = 0; i < ListeEleves.size(); i++){
         // --- Retrieve current Eleve from the list
         myEleve = (Eleve) ListeEleves.get(i);
         // --- Display eleve properties in string to return
         toreturn += "Nom : "+myEleve.nom+"   Prenom : "+myEleve.prenom+"\n";
    }
    return toreturn;
}


Ce qui est en gras est à modifier éventuellement selon les propriétés de ta classe Eleve.
Le code n'as pas été testé ni écrit dans un environnement de développement donc test à faire au préalable :)
0
Utilisateur anonyme
27 févr. 2008 à 15:02
Alors, je vais essayer de faire simple :

En java, "une bonne programmation" consiste à ajouter une méthode toString() à tes classes.

En effet dans l'instruction suivante :

System.out.println("Mon fichier élèves après ajout : " + MonFichierEleve);

le système exécute en fait MonFichierEleve.toString().

Il faut donc que tu rajoutes une méthode dans ta classe FichierEleves comme suit :

public String toString(){
return ListeEleves.toString();
}

La méthode toString de l'objet Vector premet d'afficher la liste de tous ces éléments. En d'autres termes la méthode toString de Vector appelle la méthode toString de tous les éléments qu'il contient.

Il faut donc que tu rajoute une méthode toString dans ta classe Eleve comme suit :

public String toString(){
return "Nom : "+getNom()+" Prénom : "+getPrenom()+" Note : "+getNote();
}

Ca devrait bien marcher maintenant ;-)
1
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
27 févr. 2008 à 15:29
Wow ! GENIAL !!!!!!
MERCI ENCORE BEAUCOUP à vous 2 qui m'avez énormément aider !

La méthode toString() marche nickel !


Je continue mon programme ! J'ai encore pas mal de choses à faire, notamment des méthodes de tris... et je ne sais pas encore comment je vais m'y prendre, mais je vais y réfléchir ;-)

Encore merciiiiii
1
Bonjour,

Même si ça va déterrer un vieux sujet, mais je pense que vous trois vous méritez un grand merci =) Vous m'avez sauvé en postant ce problème et lui trouvant la bonne solution.

Merci bien!
0