Was löst meine NullPointerException aus? (Vererbung)

Bitte aktiviere JavaScript!
Moin!
Habe mich an eine Aufgabe aus dem Studium gewagt die wie folgt klingt: "Schreiben Sie ein Programm, das die Struktur eines Unternehmens abbildet. In dem Unternehmen gibt es mehrere Abteilungen. In jeder Abteilung arbeiten mehrere Angestellte und ein Abteilungsleiter." Der Angestellte hat dann diverse Attribute und der Abteilungsleiter soll ein Angestellter sein (also von ihm erben).
Soweit so gut, habe das ganze dann ausprogrammiert, wollte es mit ein paar Werten füttern aber es wird eine NullPointerException geworfen. Ich weiß, was
diese bedeutet und deshalb ist es mir umso rätselhafter, weshalb sie in diesem Fall geworfen wird. Hier ist der Code:
Java:
public class Aufg3Unternehmen {
    Aufg3Abteilung[] abteilungen;
}
Java:
public class Aufg3Abteilung {
    Aufg3Angestellter[] angestellte;
    Aufg3Abteilungsleiter abteilungsleiter;
}
Java:
public class Aufg3Angestellter {
    String nachname;
    String vorname;
    String identifikator;
    double grundgehalt = 2000;
    double gehaltsfaktor = 1;
    String geburtsdatum;
    double gehalt;
    
    public double getGehalt() {
        gehalt = grundgehalt * gehaltsfaktor;
        return gehalt;
    }
    
    public String getNachname()  {
        return nachname;
    }
    public void setNachname(String nachname) {
        this.nachname = nachname;
    }
    
    public String getVorname()  {
        return vorname;
    }
    public void setVorname(String vorname) {
        this.vorname = vorname;
    }
    
    public String getIdentifikator()  {
        return identifikator;
    }
    public void setIdentifikator(String identifikator) {
        this.identifikator = identifikator;
    }
    
    public double getGrundgehalt()  {
        return grundgehalt;
    }
    public void setGrundgehalt(double grundgehalt) {
        this.grundgehalt = grundgehalt;
    }
    
    public double getGehaltsfaktor() {
        return gehaltsfaktor;
    }
    public void setGehaltsfaktor(double gehaltsfaktor) {
        this.gehaltsfaktor = gehaltsfaktor;
    }
    
    public String getGeburtsdatum() {
        return geburtsdatum;
    }
    public void setGeburtsdatum(String geburtsdatum) {
        this.geburtsdatum = geburtsdatum;
    }
}
Java:
public class Aufg3Abteilungsleiter extends Aufg3Angestellter {
    double gehaltsfaktor = 2;
    public void befoerdern(Aufg3Angestellter angestellter) {
        angestellter.gehaltsfaktor = angestellter.gehaltsfaktor * 1.1;
    }
    
    @Override
    public double getGehalt() {
        gehalt = grundgehalt * gehaltsfaktor;
        return gehalt;
    }
}
Java:
public class Aufg3Main {
    public static void main(String[] args) {
        Aufg3Unternehmen unternehmen = new Aufg3Unternehmen();
        unternehmen.abteilungen = new Aufg3Abteilung[1];
        unternehmen.abteilungen[0].angestellte = new Aufg3Angestellter[1];
        unternehmen.abteilungen[0].abteilungsleiter = new Aufg3Abteilungsleiter();
        unternehmen.abteilungen[0].angestellte[0] = new Aufg3Angestellter();
        
        System.out.println("Angestellter Gehalt: " + unternehmen.abteilungen[0].angestellte[0].getGehalt());
        System.out.println("Abteilungsleiter Gehalt: " + unternehmen.abteilungen[0].abteilungsleiter.getGehalt());
        
        unternehmen.abteilungen[0].abteilungsleiter.befoerdern(unternehmen.abteilungen[0].angestellte[0]);
        System.out.println("Angestellter befördert Gehalt: " + unternehmen.abteilungen[0].angestellte[0].getGehalt());
    }
}
 
A

Anzeige




Schau mal hier —> (hier klicken)
Du initialisierst die Arrays in Aufg3Unternehmen und Aufg3Abteilung nie.
 
Nein. In der Main Methode versuchst du einzelne Elemente deines Arrays zu initialisieren.
Vorher musst du aber noch dein Array initialisieren.

Stell dir vor: Du versuchst gerade Dinge in ein Regal zustellen .. das Regal gibt es aber noch gar nicht.
Java:
String[] regal = new String[5];
regal[0] = "Buch";
regal[1] = "Pflanze";
...
 
Nein. In der Main Methode versuchst du einzelne Elemente deines Arrays zu initialisieren.
Vorher musst du aber noch dein Array initialisieren.

Stell dir vor: Du versuchst gerade Dinge in ein Regal zustellen .. das Regal gibt es aber noch gar nicht.
Java:
String[] regal = new String[5];
regal[0] = "Buch";
regal[1] = "Pflanze";
...
Okay verstanden. Aber wie initalisiere ich die Abteilung, die hat ja schließlich keine Attribute die ich belegen kann? Beim Angestellten ist das ja simpel mit einem Konstruktor....
 
Du kannst es auch hier im Konstruktor machen. Die Frage ist sicherlich eher wie viele Elemente das Array haben soll.
Ist dazu in der Aufgabenstellung was gegeben? Falls nicht musst du eben zB ein Array mit 10 Elementen anlegen und, falls mehr hinzugefügt werden sollen, das Array "vergrößern".
Später würde man dafür eine Liste nehmen - die werdet ihr aber sicherlich noch nicht behandelt haben.
 
Nein. In der Main Methode versuchst du einzelne Elemente deines Arrays zu initialisieren.
Vorher musst du aber noch dein Array initialisieren.

Stell dir vor: Du versuchst gerade Dinge in ein Regal zustellen .. das Regal gibt es aber noch gar nicht.
Java:
String[] regal = new String[5];
regal[0] = "Buch";
regal[1] = "Pflanze";
...
Habe es jetzt gelöst indem ich in der Abteilung-Klasse einen Konstruktor wie folgt angelegt habe:
Java:
    public Aufg3Abteilung(Aufg3Angestellter[] angestellte, Aufg3Abteilungsleiter abteilungsleiter) {
        this.angestellte = angestellte;
        this.abteilungsleiter = abteilungsleiter;
    }
Dann noch Konstruktoren in Angestellter- und Abteilungsleiter-Klasse und dann die Main Methode geändert zu:
Java:
        unternehmen.abteilungen = new Aufg3Abteilung[1];
        unternehmen.abteilungen[0] = new Aufg3Abteilung(new Aufg3Angestellter[1], new Aufg3Abteilungsleiter("Boss", "Big", "bb", "01.01.1990"));
        unternehmen.abteilungen[0].angestellte[0] = new Aufg3Angestellter("Müller", "Max", "mm", "01.01.1990");
Wirkt auf mich zwar um einiges komplizierter aber naja klappt! Danke für die Erklärung
 
Du kannst es auch hier im Konstruktor machen. Die Frage ist sicherlich eher wie viele Elemente das Array haben soll.
Ist dazu in der Aufgabenstellung was gegeben? Falls nicht musst du eben zB ein Array mit 10 Elementen anlegen und, falls mehr hinzugefügt werden sollen, das Array "vergrößern".
Später würde man dafür eine Liste nehmen - die werdet ihr aber sicherlich noch nicht behandelt haben.
Listen haben wir bereits letztes Semester gemacht. Mir ist klar, dass ein Array hier aufgrund seiner anfangs festgelegten Größe Probleme verursachen kann, da in der Aufgabenstellung dazu aber nichts gesagt wird, und er einfacher zu handeln ist, löse ich die Aufgabe mit einem (sehr kleinen) Array.
 
Du machst es auch komplizierter, als es eigentlich sein muss :p
Java:
public class Aufg3Abteilung {
    private Aufg3Angestellter[] angestellte;

    public Aufg3Abteilung() {
         this.angestellte = new Aufg3Abteilung[1];
    }
}
 
Listen haben wir bereits letztes Semester gemacht. Mir ist klar, dass ein Array hier aufgrund seiner anfangs festgelegten Größe Probleme verursachen kann, da in der Aufgabenstellung dazu aber nichts gesagt wird, und er einfacher zu handeln ist, löse ich die Aufgabe mit einem (sehr kleinen) Array.
Wenn ihr diese bereits hattet, solltest du sie auch verwenden. Das macht nämlich nichts komplizierter sondern einfacher ;)
Java:
public class Aufg3Abteilung {
    private List<Aufg3Angestellter> angestellte;

    public Aufg3Abteilung() {
         this.angestellte = new ArrayList<>();
    }

    public void angestelltenHinzufuegen(Aufg3Angestellter angestellter) {
         this.angestellte.add(angestellter);
    }
}
 
Du machst es auch komplizierter, als es eigentlich sein muss :p
Java:
public class Aufg3Abteilung {
    Aufg3Angestellter[] angestellte;

    public Aufg3Abteilung() {
         this.angestellte = new Aufg3Abteilung[1];
    }
}
Ja aber so würde ich ja schon in der Abteilung-Klasse festlegen, wie groß der "angestellte" Array sein soll, das gefällt mir an der Lösung nicht so :D Denke auch du meinst " this.angestellte = new Aufg3Angestellter[1];" anstatt "this.angestellte = new Aufg3Abteilung[1];"

Wenn ihr diese bereits hattet, solltest du sie auch verwenden. Das macht nämlich nichts komplizierter sondern einfacher ;)
Java:
public class Aufg3Abteilung {
    private List<Aufg3Angestellter> angestellte;

    public Aufg3Abteilung() {
         this.angestellte = new ArrayList<>();
    }

    public void angestelltenHinzufuegen(Aufg3Angestellter angestellter) {
         this.angestellte.add(angestellter);
    }
}
Ach ne solche Listen mit ArrayList hatten wir noch nicht, das kommt erst bald.
Ich meinte Listen/Bäume mit Knoten und getNext(), setPrev(), setLeft(), etc....
 
Denke auch du meinst " this.angestellte = new Aufg3Angestellter[1];" anstatt "this.angestellte = new Aufg3Abteilung[1];"
Ja meine ich. Bin beim Copy&Pasten zu schnell gewesen. ;)
Ja aber so würde ich ja schon in der Abteilung-Klasse festlegen, wie groß der "angestellte" Array sein soll
Alternativ könntest du auch einfach die Größe übergeben. Da die bei dir aber momentan eh immer 1 ist spielt das keine Rolle.
 
A

Anzeige




Vielleicht hilft dir das hier weiter: (klicke hier)
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben