# Null-Pointer Exception Problem



## theworstprogram (10. Mrz 2015)

Hallo! Beim Lösen meiner Hausaufgaben bin ich auf folgendes Problem gestoßen. Wir sollten eine Morsecode Anwendung programmieren, welche wie der Name schon sagt Morsecodes in Fließtext umwandeln: 

```
import sum.komponenten.*;
import sum.werkzeuge.*;
import sum.ereignis.*;

public class SuMAnwendung extends EBAnwendung
{
    // Objekte
    private Knopf hatKnopfCodieren;
    private Knopf hatKnopfDecodieren;
    private Knopf hatKnopfBeenden;
    
    private Zeichenbereich hatZeichenbereich1;
    private Zeichenbereich hatZeichenbereich2;
    private Zeichenbereich hatZeichenbereich3;
    private Etikett hatEtikettAusgangstext;
    private Etikett hatEtikettMorsecode;
    private Etikett hatEtikettDecodierterText;
    private Etikett hatEtikettMorsecodierung;
    private Textwerkzeug hatTW;
    private Baum aktuellerBaum;
    private Baum hatMorsebaum;
    char lZeichen;

    // Attribute

/**
 * Konstruktor
 */
    public SuMAnwendung()
    {
        //Initialisierung der Oberklasse
        super(1075, 964);

        hatKnopfCodieren = new Knopf(292, 580, 133, 36, "codieren");
        hatKnopfCodieren.setzeBearbeiterGeklickt("hatKnopfCodierenGeklickt");
        hatKnopfDecodieren = new Knopf(608, 581, 128, 35, "Decodieren");
        hatKnopfDecodieren.setzeBearbeiterGeklickt("hatKnopfDecodierenGeklickt");
        hatKnopfBeenden = new Knopf(433, 677, 173, 32, "Beenden");
        hatKnopfBeenden.setzeBearbeiterGeklickt("hatKnopfBeendenGeklickt");
        hatZeichenbereich1 = new Zeichenbereich(94, 213, 232, 341, "");
        hatZeichenbereich2 = new Zeichenbereich(394, 213, 233, 339, "");
        hatZeichenbereich3 = new Zeichenbereich(710, 213, 249, 342, "");
        hatEtikettAusgangstext = new Etikett(94, 179, 100, 25, "Ausgangstext");
        // Ausrichtung
        hatEtikettAusgangstext.setzeAusrichtung(Ausrichtung.LINKS);
        hatEtikettMorsecode = new Etikett(395, 179, 100, 25, "Morsecode");
        // Ausrichtung
        hatEtikettMorsecode.setzeAusrichtung(Ausrichtung.LINKS);
        hatEtikettDecodierterText = new Etikett(709, 183, 100, 25, "Decodierter Text");
        // Ausrichtung
        hatEtikettDecodierterText.setzeAusrichtung(Ausrichtung.LINKS);
        hatEtikettMorsecodierung = new Etikett(371, 38, 277, 69, "Morsecodierung");
        // Ausrichtung
        hatEtikettMorsecodierung.setzeAusrichtung(Ausrichtung.MITTE);
        
        this.erzeugeMorsebaum();
        hatTW = new Textwerkzeug();
    }

/**
 * Vorher: Ereignis GeklicktvonhatKnopfCodieren fand statt.
 * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird)
 */
    public void hatKnopfCodierenGeklickt()
    {
        //    Schreiben Sie hier den Text ihres Dienstes
    }

/**
 * Vorher: Ereignis GeklicktvonhatKnopfDecodieren fand statt.
 * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird)
 */
    public void hatKnopfDecodierenGeklickt()
    {
        String lString;
        //char lZeichen;
        
        hatZeichenbereich3.loescheAlles();
        lString = hatZeichenbereich2.inhaltAlsText();
        for (int i = 1; i <= hatTW.laenge(lString); i++)
        {
            lZeichen = hatTW.zeichenAn(lString, i);
            this.verarbeiteMorsezeichen(lZeichen);
        }
    }

/**
 * Vorher: Ereignis GeklicktvonhatKnopfBeenden fand statt.
 * Nachher: (schreiben Sie, was in dieser Methode ausgefuehrt wird)
 */
    public void hatKnopfBeendenGeklickt()
    {
        this.beenden();
    }

    /*public void erzeugeMorsebaum()
    {
        Baum lBaum1, lBaum2, lBaum3, lBaum4, lBaum5, lBaum6, lBaum7, lBaum8;
        
        lBaum1 = new Baum("H");
        lBaum2 = new Baum("V");
        lBaum3 = new Baum("S", lBaum1, lBaum2);
        lBaum1 = new Baum("F");
        lBaum2 = new Baum("Ü");
        lBaum4 = new Baum("U", lBaum1, lBaum2);
        lBaum5 = new Baum("I", lBaum3, lBaum4);
        lBaum1 = new Baum("L");
        lBaum2 = new Baum("Ä");
        lBaum3 = new Baum("R", lBaum1, lBaum2);
        lBaum1 = new Baum("P");
        lBaum2 = new Baum("J");
        lBaum4 = new Baum("W", lBaum1, lBaum2);
        lBaum6 = new Baum("A", lBaum3, lBaum4);
        lBaum7 = new Baum("E", lBaum5, lBaum6);
        lBaum1 = new Baum("B");
        lBaum2 = new Baum("X");
        lBaum3 = new Baum("D", lBaum1, lBaum2);
        lBaum1 = new Baum("C");
        lBaum2 = new Baum("Y");
        lBaum4 = new Baum("K", lBaum1, lBaum2);
        lBaum5 = new Baum("N", lBaum3, lBaum4);
        lBaum1 = new Baum("Z");
        lBaum2 = new Baum("Q");
        lBaum3 = new Baum("G", lBaum1, lBaum2);
        lBaum1 = new Baum("Ö");
        lBaum2 = new Baum("CH");
        lBaum4 = new Baum("O", lBaum1, lBaum2);
        lBaum6 = new Baum("M", lBaum3, lBaum4);
        lBaum8 = new Baum("T", lBaum5, lBaum6);
        hatMorsebaum = new Baum(null, lBaum7, lBaum8);
    }*/
    public void erzeugeMorsebaum()
    {
        Baum lBaum1, lBaum2, lBaum3, lBaum4, lBaum5, lBaum6, lBaum7, lBaum8;
        
        lBaum1 = new Baum("H");
        lBaum2 = new Baum("V");
        lBaum3 = new Baum("S", lBaum1, lBaum2);
        lBaum1 = new Baum("F");
        lBaum2 = new Baum("†");
        lBaum4 = new Baum("U", lBaum1, lBaum2);
        lBaum5 = new Baum("I", lBaum3, lBaum4);
        lBaum1 = new Baum("L");
        lBaum2 = new Baum("€");
        lBaum3 = new Baum("R", lBaum1, lBaum2);
        lBaum1 = new Baum("P");
        lBaum2 = new Baum("J");
        lBaum4 = new Baum("W", lBaum1, lBaum2);
        lBaum6 = new Baum("A", lBaum3, lBaum4);
        lBaum7 = new Baum("E", lBaum5, lBaum6);
        lBaum1 = new Baum("B");
        lBaum2 = new Baum("X");
        lBaum3 = new Baum("D", lBaum1, lBaum2);
        lBaum1 = new Baum("C");
        lBaum2 = new Baum("Y");
        lBaum4 = new Baum("K", lBaum1, lBaum2);
        lBaum5 = new Baum("N", lBaum3, lBaum4);
        lBaum1 = new Baum("Q");
        lBaum2 = new Baum("Z");
        lBaum3 = new Baum("G", lBaum1, lBaum2);
        lBaum1 = new Baum("…");
        lBaum4 = new Baum("O", lBaum1, null);
        lBaum6 = new Baum("M", lBaum3, lBaum4);
        lBaum8 = new Baum("T", lBaum5, lBaum6);
        hatMorsebaum = new Baum(null, lBaum7, lBaum8);
    }
    
    public void verarbeiteMorsezeichen(char pZeichen)
    {
        String lBuchstabe;
        
        switch (pZeichen)
        {
            case '.': aktuellerBaum = aktuellerBaum.linkerTeilbaum();
            break;
            
            case '-': aktuellerBaum = aktuellerBaum.rechterTeilbaum();
            break;
            
            case '/': lBuchstabe = (String)aktuellerBaum.inhalt();
            hatZeichenbereich3.haengeAn(lBuchstabe);
            aktuellerBaum = hatMorsebaum;
            break;
        }
    }
}
```


```
import sum.werkzeuge.*;

/**
 * @author Bernard Schriek
 * @version 16.07.2006
 */
public class Baum
{
    // Bezugsobjekte
    /**
     * Der Inhalt des Knotens bzw. der Wurzel
     */
    private Object kenntInhalt;
    
    /**
     * Der linke Teilbaum
     */
    private Baum kenntLinks;
    
    /**
     * Der rechte Teilbaum
     */
    private Baum kenntRechts;
    
    /**
     * Der Vater des Baums
     */
    private Baum kenntVater;
    
    /**
     * Ein Textwerkzeug f�r den Dienst toString
     */
    private Textwerkzeug hatTW;
    // Attribute

    // Konstruktor
    /**
     * Ein neuer Baum mit leeren Teilb�umen wird erzeugt
     * @param pInhalt das Objekt, das der Inhalt der Wurzel wird
     */
    public Baum(Object pInhalt)
    {
        kenntInhalt = pInhalt;
        kenntLinks = null;
        kenntRechts = null;        
        kenntVater = null;
        hatTW = new Textwerkzeug();
    }

    /**
     * Ein neuer Baum mit zwei Teilb�umen wird erzeugt
     * @param pInhalt das Objekt, das der Inhalt der Wurzel wird
     * @param pLinks der linke Teilbaum
     * @param pRechts der rechte Teilbaum
     */
    public Baum(Object pInhalt, Baum pLinks, Baum pRechts)
    {
        kenntInhalt = pInhalt;
        kenntLinks = pLinks;
        if (pLinks != null)
            pLinks.setzeVater(this);
        kenntRechts = pRechts;
        if (pRechts != null)
            pRechts.setzeVater(this);
        kenntVater = null;
        hatTW = new Textwerkzeug();
    }

    // Dienste
    /**
     * Der Inhalt der Wurzel wird zur�ckgegeben
     * @return den Inhalt der Wurzel
     */
    public Object inhalt()
    {
        return kenntInhalt;
    }
    
    /**
     * Der Inhalt der Wurzel wird ge�ndert
     * @param pInhalt der neue Inhalt der Wurzel
     */
    public void setzeInhalt(Object pInhalt)
    {
        kenntInhalt = pInhalt;
    }
    
    /**
     * Wenn die Wurzel keinen Inhalt besitzt, wird true zur�ckgegeben
     * @return ob der Inhalt der Wurzel leer ist
     */
    public boolean istLeer()
    {
        return kenntInhalt == null;
    }
    
    /**
     * Der linke Teilbum wird zur�ckgegeben
     * @return den linken Teilbaum
     */
    public Baum linkerTeilbaum()
    {
        return kenntLinks;
    }
    
    /**
     * Der rechte Teilbum wird zur�ckgegeben
     * @return den rechten Teilbaum
     */
    public Baum rechterTeilbaum()
    {
        return kenntRechts;
    }
    
    /**
     * Der rechte Teilbaum wird ver�ndert
     * @param pBaum der neue rechte Teilbaum
     */
    public void setzeLinkenTeilbaum(Baum pBaum)
    {
        kenntLinks = pBaum;
        if (pBaum != null)
            pBaum.setzeVater(this);
    }
    
    /**
     * Der rechte Teilbaum wird ver�ndert.
     * @param pBaum der neue rechte Teilbaum
     */
    public void setzeRechtenTeilbaum(Baum pBaum)
    {
        kenntRechts = pBaum;
        if (pBaum != null)
            pBaum.setzeVater(this);
    }
    
    /**
     * Wenn der Baum keine Teilb�ume hat, wird true zur�ckgegeben
     * @return ob keine Teilb�ume vorhanden sind
     */
    public boolean istBlatt()
    {
        return kenntLinks == null && kenntRechts == null;
    }
    
    /**
     * Der Vater des Baums wird zur�ckgegeben
     * @return den Vater des Baums
     */
    public Baum vater()
    {
        return kenntVater;
    }
    
    /**
     * Der Vater des Baums wird ge�ndert
     * @param pBaum der neue Vater
     */
    public void setzeVater(Baum pBaum)
    {
        kenntVater = pBaum;
    }
    
    /**
     * Wenn der Baum keinen Vater hat, wird true zur�ckgegeben
     * @return ob kein Vater vorhanden ist
     */
    public boolean istWurzel()
    {
        return kenntVater == null;
    }
    
    /**
     * Eine Stringrepr�sentation des Baum mit seinen Unterb�umen wird zur�ckgegeben
     * @return einen String, der den Baum in mehreren Zeilen darstellt
     */
    public String toString()
    {
        String lString;
        
        lString = this.baumString(0);
        if (hatTW.laenge(lString) > 0)
           lString = hatTW.textOhne(lString, hatTW.laenge(lString), hatTW.laenge(lString));
        return lString;
    }
    
    /**
     * rekursiver Dienst um die Baumstruktur durch Einr�ckungen darzustellen
     * @param pTiefe die aktuelle Tiefe im Baum
     */
    private String baumString(int pTiefe)
    {
        String lString, lPunkte;
        
        lString = "";
        lPunkte = "";
        for (int i = 1; i <= pTiefe; i++)
            lPunkte += ".";
        if (kenntLinks != null)
            lString += kenntLinks.baumString(pTiefe + 1);
        if (kenntInhalt == null)
            lString += lPunkte + "leer\n";
        else
            lString += lPunkte + kenntInhalt.toString() + "\n";
        if (kenntRechts != null)
            lString += kenntRechts.baumString(pTiefe + 1);
        return lString;
    }}
```

Das sind die beiden Klassen. Beim Ausführen gibt es allerdings eine Null Pointer Exception bei diesem Teil:

```
this.verarbeiteMorsezeichen(lZeichen);
```

Bitte um Hilfe oder Ratschläge wie ich dieses Problem lösen kann. Eigentlich müsste ich alle Objekte erstellt haben etc.

MfG


----------



## Dompteur (10. Mrz 2015)

Deine NullpointerException passiert nicht in der angegebene Zeile, sondern in der Methode verarbeiteMorsezeichen.
Die Instanzvariable "aktuellerBaum" wurde nirgends initialisiert. In der besagten Methode greifst du aber in allen Zweigen auf eine Methode dieses Objekts zu.


----------



## VfL_Freak (10. Mrz 2015)

Moin,

richtig 

BTW: IMMER den kompletten StackTrace mitposten! Die wenigsten (_auch ich nicht_!!) machen sich die Mühe, erst im Code zu suchen, wo genau denn der Fehler auftreten könnte ....

Gruß Klaus


----------



## theworstprogram (10. Mrz 2015)

ich scheine mal wieder im totalen ret**-modus zu sein.. aber ich habe grade keine ahnung was für parameter ich beim initialisieren eingeben sollte geschweige denn wo sprich global oder lokal..


----------



## VfL_Freak (10. Mrz 2015)

Moin,

was soll denn Deiner Meinung nach "*aktuellerBaum*" sein ??

Gruß Klaus


----------



## theworstprogram (10. Mrz 2015)

ein Objekt der Klasse Baum oder nicht? wenn ich allerdings lokal: " aktuellerBaum = new Baum(); " eingebe brauche ich schließlich noch parameter


----------



## VfL_Freak (10. Mrz 2015)

Moin,



theworstprogram hat gesagt.:


> ein Objekt der Klasse Baum oder nicht? wenn ich allerdings lokal: " aktuellerBaum = new Baum(); " eingebe brauche ich schließlich noch parameter


Einen Konstruktor "*Baum()*" gibt es ja bei Dir auch nicht ....
Du musst halt ein "*Object pInhalt*" übergeben, so wie deklariert!
Ob das an der Stelle geht, mit welchem Inhalt und was das überhaupt ist, müsstet Du uns sagen (nicht umgekehrt) !

Gruß Klaus


----------



## theworstprogram (10. Mrz 2015)

ach ich lass es ich blick selber bei dem programm nicht mehr durch danke trotzdem


----------

