NullPointerException bei Übergabe an eine Methode

Snape hat dir wie er sagt eine mögliche Lösung zugesandt, dann kann ich mich
darauf beschränken, etwas anderes anzumeckern :-)

Mir wird der Zweck deines Codes nicht so ganz klar.

Code:
Meine Unterklasse

import java.util.*;
import java.util.Vector.*;
import java.io.*;


public class AdressListe extends Vector
{

Geburtstag geb;

public void adresseEintragen(Geburtstage temp)
{
this.add(temp); //Liste wird hinzugefügt
}

public void adresseAuslesen (){

geb.auslesen(); //Aufruf der Methode aus der Hauptklasse

}
Du erweiterst einen Vector der letztendliche eine Instanz einer von Frame abgeleiteten
Klasse besitzt?

Laut OOP sollte mann Vererbung dann benutzen wenn eine "ist - ein " Beziehung besteht.
Die Frage ist:
Ist ein Geburstag ein Frame? klingt unlogisch.

Auch Instanzvariablen sollten nach dem Prinzip "hat ein" genutzt werden.
Hat eine AdressenList einen Frame
auch das ist nicht ganz logisch.
Genaus hat bei dir der Geburtstag Frame eine Adressenliste, du hast hier
also eine 1 - 1 beziehung.

Wenn du diesen Umstand änderst, erreichst du zudem das du keine Klasse erschaffen musst die eine Vorhanden nur unwesentlich erweitert.

Zudem trennst du die Logic nicht von der Ansicht. Das heisst letztendlich baust du den Controller direkt in eine Ansicht ein die hier der GeburtstagFrame ist.
Besser du hälst dich an MVC und hälst dir einen Controller.

Dieser Controller kann die Ansicht steuern und die Daten (hier adressliste) ändern.
Ich weiss ja nicht was der Geburtstagsframe koennen sollte, aber ich gehe aufgrund
von AdressenList davon aus du willst eine Art Verwaltung von Gästen für eine Geburtstagparty programmieren (veilleicht aus den Fingern gesaugt)

Code:
public class Party {
   private Vector adressVector;
   private MyView view;
  
  public Party(MyView view) { this.view = view }   

   public void addAdress(Adress adress) {
     adressVector.add(adress);
     view.setAdressList(adressVector);
     view.repaint();
   }
   
....
}

Damit hast du deinen Frame komplett von der Adressen Liste entkoppelt und du arbeitest nur mit dem Controller (hier Party) der Zwischen der Ansicht und den Daten vermittelt.

Vorteil ist das du freier bist die Ansicht zu wechseln. Deine Ansicht muss als einzige Vorraussetzung haben MyView zu implementieren (bzw davon abzuleiten).

Ist nur eine Möglichkeit. Das wichtigste ist das du Daten und Ansicht voneinander komplett trennst.
 
Original geschrieben von webix
wie schon in pm geschrieben:

public Geburtstag(AdressListe liste)
{
super ("Geburtstag");
this.setSize(600,480);
this.setLayout(null);
this.liste = liste;
}

ist schon vorhanden und bekommt AdressListe übergeben.

Siehe PM. Wenn Du

Geburtstag geb= new Geburtstag();

aufrufst, brauchst Du auch den zugehörigen Konstruktor zu new Geburtstag(). Und den habe ich Dir sogar schon geliefert. *fassungslos*.

Für

Geburtstag geb= new Geburtstag();

brauchst Du

public Geburtstag()
{
super ("Geburtstag");
this.setSize(600,480);
this.setLayout(null);
}

während für

public Geburtstag(AdressListe liste)
{
super ("Geburtstag");
this.setSize(600,480);
this.setLayout(null);
this.liste = liste;
}

ein Aufruf dieser Form nötig ist:

AdressListe liste = new AdressListe();
Geburtstag f = new Geburtstag(liste);
 
Original geschrieben von webix
wie schon in pm geschrieben:

public Geburtstag(AdressListe liste)
{
super ("Geburtstag");
this.setSize(600,480);
this.setLayout(null);
this.liste = liste;
}


ist schon vorhanden und bekommt AdressListe übergeben.


Code:
    public class AdressListe extends Vector
    {

    Geburtstag geb;

    public void adresseEintragen(Geburtstage temp)
    {
    this.add(temp); //Liste wird hinzugefügt
    }

    public void adresseAuslesen (){

    geb.auslesen(); //Aufruf der Methode aus der Hauptklasse

    }

Hier fehlt der Constructor der dir geb setzt.
 
Original geschrieben von Christian Fein
Code:
    public class AdressListe extends Vector
    {

    Geburtstag geb;

    public void adresseEintragen(Geburtstage temp)
    {
    this.add(temp); //Liste wird hinzugefügt
    }

    public void adresseAuslesen (){

    geb.auslesen(); //Aufruf der Methode aus der Hauptklasse

    }

Hier fehlt der Constructor der dir geb setzt.

Nun, er könnte auch
Code:
public class AdressListe extends Vector
{
   Geburtstag geb = new Geburtstag();
//...
}
so beginnen.
 
Original geschrieben von Christian Fein
Oder er könnte seine Anwendung umschreiben :-)

Hehe, das wäre in der Tat die beste Lösung. So recht verstanden habe ich auch noch nicht, warum die Vector-Klasse abgeleitet werden muss usw. usw.
Und auch hier sieht man wieder eine unnötige Überladung der main()-Methode...
Interessant auch, dass es in der Klasse Geburtstag einmal eine Instanzvariable AdressListe liste gibt und in main() erneut AdressListe liste = new AdressListe() Verwendung findet... Dieses ganze Geraffel ist konzeptionell für den Eimer...
 
Zurück