10. december 2008 - 09:33Der er
23 kommentarer og 1 løsning
Brug for hjælp til en NullPointerException
Jeg får en NullPointerException når jeg forsøger at tilknytte et person objekt til et hold objekt og jeg kan ikke helt selv gennemskue hvorfor dette sker.
Hele denne "tilmeldings procedure" spænder over 3 klasser og hvis vi starter i min GUI hvor jeg oprettet et objekt af typen ---------------------------------------------------------- Kontrol kontrol = new Kontrol(); ----------------------------------------------------------
Herefter har jeg en knap med 2 indtastningsfelter: ----------------------------------------------------------
private void jToggleButton2ActionPerformed(java.awt.event.ActionEvent evt) { int medlemsnr = Integer.parseInt( tfHentMedlemsNr1.getText() ); int holdnr = Integer.parseInt( tfTilmeldHoldnr.getText() );
kontrol.tilmeldMedlemTilHold(medlemsnr, holdnr);
JOptionPane.showMessageDialog(null, "Medlemmet er tilknyttet holdet\n Listen er gemt."); } ----------------------------------------------------------
I min Kontrol klasse har jeg følgende klasse variabler og konstruktør således, at jeg kan få fat i objekter fra andre klasser: ----------------------------------------------------------
public class Kontrol implements Serializable {
private MedlemsListe medlemsRef; private HoldListe holdRef; private Hold holdTilmeldingsRef;
public Kontrol() { medlemsRef = new MedlemsListe(); holdRef = new HoldListe(); holdTilmeldingsRef = new Hold(); } ---------------------------------------------------------- I samme klasse har jeg min metode så jeg kan tilknytte et medlem til et hold:
//Metode til at kunne tilmelde sig et hold udfra holdnr og medlemsnr. public void tilmeldMedlemTilHold( int medlemsnr, int holdnr ) { //Henter et medlems objekt udfra medlemsnummer. Medlem medlem = medlemsRef.hentMedlem( medlemsnr );
//Henter ønskede hold objekt via metoden hentAktuelHold() som ligger i HoldListe klassen Hold hold = holdRef.hentAktuelHold( holdnr );
//Sammenkæder nu hold og medlemmer således at de samles hold.tilmeldMedlemTilHold( medlem ); } ----------------------------------------------------------
I min MedlemsListe klasse (medlemsRef) har jeg lavet følgende metode som søger min ArrayListe igennem og hvis det indtastede medlemsnr. findes i listen returneres et medlems objekt: ---------------------------------------------------------- private ArrayList<Medlem> ml;
public MedlemsListe() { ml = new ArrayList<Medlem>(); }
public Medlem hentMedlem( int medlemsnr ) { Medlem resultat=null; int i=0; while (i<ml.size() && medlemsnr!=ml.get(i).getMedlemsnr()) i++; if (i<ml.size()) // Der er fundet resultat = ml.get(i); return resultat; } ----------------------------------------------------------
Samme metode findes i min HoldListe klasse, blot returneres et hold objekt hvis holdet findes i listen ---------------------------------------------------------- //Her initialiserer vi ArrayListen til vores hold private ArrayList<Hold> holdene;// = new ArrayList<Hold>();
public HoldListe() { holdene = new ArrayList<Hold>(); }
public Hold hentAktuelHold( int holdnr ) { Hold resultat=null; int i=0; while (i<holdene.size() && holdnr!=holdene.get(i).getHoldnr()) i++; if (i<holdene.size()) // Der er fundet resultat = holdene.get(i); return resultat; } ---------------------------------------------------------- I min Hold klasse har jeg mn ArrayListe som indeholder listen over tilmeldinger. Her mener/tror jeg, at hele klassen kan være interessant at vise for at kunne få hjælp: ----------------------------------------------------------
public class Hold implements Serializable {
private String dato; private String tid; private int holdnr; private String holdType; private int maxAntalDeltagere; private ArrayList<Medlem> holdTilmeldingsliste;
//Her laver vi vores konstruktør public Hold() { holdTilmeldingsliste = new ArrayList<Medlem>(); }
public Hold( String dato, String tid, int holdnr, String holdType, int maxAntalDeltagere ) { this.dato = dato; this.tid = tid; this.holdnr = holdnr; this.holdType = holdType; this.maxAntalDeltagere = maxAntalDeltagere;
}
public int getMaxAntalDeltagere() { return maxAntalDeltagere; }
public int getHoldnr() { return holdnr; }
public void tilmeldMedlemTilHold( Medlem obj ) { holdTilmeldingsliste.add( obj ); }
public ArrayList<Medlem> getTilmeldinger() { return holdTilmeldingsliste; }
//Her laver vi vores toString metode public String toString() { return "Holdnr: " + holdnr + " - Hold type: " + holdType + "\nDato: " + dato + " - Tidspunkt: " + tid + "\nMax antal deltagere: " + maxAntalDeltagere + "\n\n"; } } ---------------------------------------------------------- Som skrevet, kan jeg ikke forstå hvorfor jeg får denne nullPointerException og håber at der er en der kan hjælpe mig med at få løst dette.
Jeg er rimelig sikker at der er noget i medlems- og holdlisten, da jeg starter med at indtaste data i dem, men bare for en sikkerheds skyld - Hvordan kan jeg testet at der rent faktisk er noget i dem?
Min Nullpointer kommer her:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at fitnesscenter.Hold.tilmeldMedlemTilHold(Hold.java:57) at fitnesscenter.FitnessCenterKontrol.tilmeldMedlemTilHold(FitnessCenterKontrol.java:76) at fitnesscenter.HovedMenu.jToggleButton2ActionPerformed(HovedMenu.java:713)
men kan teste om hold er null ved at lave en if-sætning eller er der andre måder dette kan/bør gøres på?
Du opretter kun holdTilmeldingsliste i din parameterløse constructor - din constructor med parametre opretter den ikke. Sørg for at den gør det - nu er det noget tid siden jeg har arbejdet i Java, så kan ikke huske præcist hvordan, men du skulle kunne skrive en linje så din constructor med parametre kalder (og dermed udfører koden) i den parameterløse udgave.
if (hold.equals(null)) { System.out.println("Intet hold fundet"); } else { hold.tilmeldMedlemTilHold( medlem ); } men den kommer stadig med nullpointer og ikke min Sys.out fejl?
Den første gør ingen forskel, for det var ikke der fejlen var denne gang ;)
Den med constructoren: Nej, lad være med at gentage koden med new. Nederst/øverst i din constructor tilføjer du linien this(); som vil kalde den parameterløse constructor (hvis jeg husker Java rigtigt).
this(); virkede men for at forstå det korrekt, så gør this(); at mit objekt i min parameterløse konstruktør bliver dannet når min anden konstruktør med parametre initialiseres, eller hvordan kan dette forstås?
Jeg får desværre stadig nullpointer og ingen andre fejl selvom jeg ændrede equals med ==
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at fitnesscenter.Hold.tilmeldMedlemTilHold(Hold.java:58) at fitnesscenter.Kontrol.tilmeldMedlemTilHold(FitnessCenterKontrol.java:78)
Hold.tilmeldMedlemTilHold er :
public void tilmeldMedlemTilHold( Medlem obj ) { holdTilmeldingsliste.add( obj ); }
Så det er måske fordi min medlems objekt ikke findes?
Super.. Tusind tak, endnu engang for din hjælp Erik :)
Jeg ved ikke rigtig hvem af jer, udover erik, der fortjener disse point.. Jeg ved at erik ikke samler på dem, og pidgeot fik mig noget af vejen ved at gøre min opmærksom på manglende initialisering af min ArrayListe i min konstruktør. Anyways. Smid et svar og tak for hjælpen alle sammen :)
//Metode til at kunne tilmelde sig et hold udfra holdnr og medlemsnr. public void tilmeldMedlemTilHold( int medlemsnr, int holdnr ) { //Henter et medlems objekt udfra medlemsnummer. Medlem medlem = medlemsRef.hentMedlem( medlemsnr ); if (medlem != null) { System.out.println("Medlem fundet"); } else { System.out.println("Medlem ikke fundet"); }
//Henter ønskede hold objekt via metoden hentAktuelHold() som ligger i HoldListe klassen Hold hold = holdRef.hentAktuelHold( holdnr ); if (hold != null) { //Sammenkæder nu hold og medlemmer således at de samles hold.tilmeldMedlemTilHold( medlem ); System.out.println("Hold fundet"); } else { System.out.println("Intet hold fundet"); } } og der kan jeg se at den både finder et medlems og et hold objekt så jeg kan vel gå udfra at disse sammenkædes i min Arrayliste holdTilmeldingsliste - ik?
Har lavet min ArrayListe holdTilmeldingsliste public så jeg kan lave en size(); i min Kontrol klasse:
//Metode til at kunne tilmelde sig et hold udfra holdnr og medlemsnr. public void tilmeldMedlemTilHold( int medlemsnr, int holdnr ) { //Henter et medlems objekt udfra medlemsnummer. Medlem medlem = medlemsRef.hentMedlem( medlemsnr ); if (medlem != null) { System.out.println("Medlem fundet"); } else { System.out.println("Medlem ikke fundet"); }
//Henter ønskede hold objekt via metoden hentAktuelHold() som ligger i HoldListe klassen Hold hold = holdRef.hentAktuelHold( holdnr ); if (hold != null) { //Sammenkæder nu hold og medlemmer således at de samles hold.tilmeldMedlemTilHold( medlem );
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.