Interface graphique, problème nullpointerexception

Résolu/Fermé
ThatRainyDay Messages postés 2 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 6 janvier 2013 - 6 janv. 2013 à 10:10
ThatRainyDay Messages postés 2 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 6 janvier 2013 - 6 janv. 2013 à 16:00
Bonjour !
Je suis entrain de programmer une petite application de gestion d'étudiants mais j'ai un problème qui me bloque totalement. J'essaye de le régler depuis des jours et je n'y arrive pas. Je me tourne donc vers vous avec l'espoir que quelqu'un pourrait m'aider.

Alors, j'ai trois Jframe : le menu principal, le JFrame pour ajouter un étudiant et le JFrame pour consulter un étudiant. Mon problème se situe au niveau du dernier JFrame. Lorsque j'essaye d'avoir la variable "étudiant" où sont stockée les informations récupérées dans le JframeAjEtudiant, on m'affiche l'exception comme quoi la variable est vide.

Je joins ci-dessous mon code. Si quelqu'un a besoin du code en entier, je pourrai le fournir sans problème.

Je remercie d'avance toute personne qui tentera de me donner un coup de main. :)

Action d'enregistrer un étudiant créé :
    
                public Classe une_classe = new Classe(); //déclaration faite en haut
	        public Etudiant etu; // déclaration faite en haut

                JButton btnEnregistrer = new JButton("Enregistrer");
		btnEnregistrer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String a = txtNom.getText();
				String b = txtPrenom.getText();
		        double n1 = Double.valueOf(txtNote1.getText());
		        double n2 = Double.valueOf(txtNote2.getText());
		        double n3 = Double.valueOf(txtNote3.getText());
		        double n4 = Double.valueOf(txtNote4.getText());
		        double [] n={n1, n2, n3, n4};
		        int x= Integer.valueOf(txtNum.getText());
		        etu = new Etudiant (a, b, x, n);
		        une_classe.ajoutEtudiant(x, etu);}
		});
public Classe getClasse(){
		return une_classe;
    }

Action de consulter un étudiant :
    
                JButton btnConsulter = new JButton("Consulter");
		btnConsulter.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int num=Integer.valueOf(txtNum.getText());
				JFrmAjEtudiant var = new JFrmAjEtudiant();
				Classe cl =var.getClasse();
				Etudiant tu = cl.getEtudiant(num);
				cl.afficheInfo(tu); /*j'affiche sur la console pour checker c'est là où est générée l'erreur*/
				txtNom.setText(tu.getNom());/*Ca ne marche pas non plus */

Sachant que les classes Etudiant et Classes sont :
import java.util.ArrayList;


public class Classe {
	ArrayList<Etudiant> liste = new ArrayList<Etudiant>();
	int max=40;
	int nombre_etudiant;
	public Classe(){
		for( int i=0; i<=100; i++ ) {
		      liste.add(null);
		}
		nombre_etudiant=0;
	}
	public void ajoutEtudiant(int num, Etudiant etu)
    { liste.add(num, etu);
    }
       public Etudiant getEtudiant(int i)
    {          return liste.get(i);
    }
       public void afficheInfo(Etudiant etu){
		System.out.println("L'étudiant est : " +etu.getNom() + " " + etu.getPrenom());
		System.out.println("Ses notes sont: " +etu.getNotes(0) + " " + +etu.getNotes(1) + " " +etu.getNotes(2) + " " +etu.getNotes(3));
		System.out.println("Sa moyenne est : " +etu.getMoyenne());
	}

        public class Etudiant {
	private int num_id;
	private String nom;
	private String prenom;
	private double[] notes;
	private double moyenne;
	private int nombre_notes;
	public Etudiant(){
	}
	public Etudiant (String p, String n, int num, double[] note){
		prenom = p;
		nom = n;
		num_id = num;
		notes=note;
	}
		public String getNom() {
		    return nom;
		  }

		  public String getPrenom() {
		    return prenom;
		  }
		  public double getNotes(int i) {
			    return notes[i];
			  }
		  public void setNom(String nom) {
			    this.nom = nom;
			  }
		  public void setPrenom(String prenom) {
			    this.prenom = prenom;
			  }
		  private double calculMoyenne(){
			 return (notes[1]+notes[2]+notes[3]+notes[0])/4 ;
		  }
		public double getMoyenne() {
			return calculMoyenne();
		}
		public void setMoyenne() {
			this.moyenne = calculMoyenne();
		}
		public void ajoutNote(double n, int i){
			notes[i]=n;
			}
		}


2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 janv. 2013 à 15:25
Si tu as tout le code effectivement ce serai plus simple, il s'agirait alors plus qu'à faire un copier-coller pour tester et voir directement le problème.

"on m'affiche l'exception comme quoi la variable est vide."
Tu parles de NullPointerException ou d'autre chose ?

Si c'est le cas, cela veut dire que tu==null, ce qui se comprend assez bien si le num de l'étudiant est inférieur à 100, parce que dans ton constructeur de Classe tu initialises les 100 premières valeurs à null (ce qui est très moche) et que ta méthode ajoutEtudiant ajoute de nouveaux étudiants par insertion (ce qui décale tous les num des étudiants déjà ajoutés).

Il serait peut-être plus intéressant de te tourner vers une Map plutôt qu'une List, je pense en particulier à une TreeMap<Integer,Etudiant> qui associerait chaque num à l'Etudiant correspondant, sans avoir toute une flopée de null inutiles et d'indices set/get qui ne coïncident pas.
1
ThatRainyDay Messages postés 2 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 6 janvier 2013
6 janv. 2013 à 16:00
Merci pour ta réponse.

Un ami m'a aidée à régler le problème avec l'utilisation des threads, ça m'a permis de partager la même variable une_classe entre tous les JFrame. En effet, le problème était que l'étudiant tu==null. J'ai aussi enlevé les arraylist pour revenir aux tableaux normaux. Le code s'exécute très bien, maintenant ! :)

Je te remercie pour le conseil de TreeMap, je la garde pour une utilisation ultérieure. ^^
0