Problem mit Enumeration

Flo123

Mitglied
Hallo Leute! Ich wollte fragen, ob mir jemand bei einem Problem helfe kann. Folgends: Wir müssen im Rahmen eines Progr. Praktikums ein Java Programm schreiben, dass den Bestand von Artikeln verwalten kann. Ich bin auch schon fast fertig damit. Das Problem ist nun, dass jeder Artikel von einem bestimmten Typ sein soll (333, 555 und 777). Das sollen wir mit einer enum Klasse lösen. Die Bestände werden in in Array Liste gespeichert und in einer einer Tabelle über die Console ausgegeben mit Gewicht, Preis, Artikelnummer und dem entsprechenden TYP (also 333, 555 und 777).
Nun wollte ich wissen wie es es hinbekomme, dass für jeden Artikel der entsprechende Typ in der Tabelle angezeigt wird.
Das Programm setzt sich folgendermaßen zusammen:

- Klasse Verwaltungseinheit
- abstrakte Klasse Bestand
- enum Klasse Goldtyp
- Klasse Ring
- Klasse Halskette
- Klasse Goldartikel

Ich liste die Quelltexte der einzelnen Klassen mal auf. Vielleicht findet ihr den Fehler und könnt mir helfen. Ich habe den Quelltext der Verwaltungsklasse gekürzt. Nun werden nur noch die Goldartikel angezeigt. Die Klasse Kunde hab ich ganz weggelassen.



Verwaltungsklasse:
-----------------

[JAVA=42]
import java.util.Collections;
import java.util.Enumeration;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.Serializable;
import java.io.FileReader;
import java.util.Iterator;
import java.util.ArrayList;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.IOException;
import de.htw.saarland.stl.Stdin;

public class Verwaltungseinheit implements Serializable
{
private ArrayList <Kunde> kundenListe;
private ArrayList <Bestand> bestandListe;

final static int FELDLAENGE = 14;

/**
* Konstruktor fuer Objekte der Klasse Verwaltungseinheit
*/

public Verwaltungseinheit()
{
kundenListe = new ArrayList <Kunde>();
bestandListe = new ArrayList <Bestand>();
}

/**
* Testdaten für Die Bestands- und Kundenverwaltung.
*/

public void initData()
{

Goldartikel g1 = new Goldartikel(10, 1, 50, Goldtyp.A);
Goldartikel g2 = new Goldartikel(12, 1, 60, Goldtyp.B);
Goldartikel g3 = new Goldartikel(9, 1, 100, Goldtyp.A);
Goldartikel g4 = new Goldartikel(4, 1, 300, Goldtyp.B);



bestandListe.add(g1);
bestandListe.add(g2);
bestandListe.add(g3);
bestandListe.add(g4);


}

private void saveDataToXML() throws IOException
{
XMLEncoder o = new XMLEncoder(new FileOutputStream("Softwareprojekt.xml"));
o.writeObject("Softwareprojekt");
o.writeObject(this);
o.close();
}

public Object loadDataFromXML() throws IOException
{
XMLDecoder o = new XMLDecoder(new FileInputStream("Softwareprojekt.xml"));
o.readObject();
Object obj = o.readObject();
o.close();
return obj;
}

private void save()
{
try
{
saveDataToXML();
}
catch(java.io.IOException ioe)
{
ioe.printStackTrace();
}
}

private void load()
{
try
{
Verwaltungseinheit v = (Verwaltungseinheit) loadDataFromXML();
v.mainMenue();
}
catch(java.io.IOException ioe)
{
ioe.printStackTrace();
}
}

private void exit()
{
System.exit(0);
}

public ArrayList getKundenListe()
{
return this.kundenListe;
}

public void setKundenListe(ArrayList liste)
{
this.kundenListe = liste;
}

public ArrayList getBestandListe()
{
return this.bestandListe;
}

public void setBestandListe(ArrayList liste)
{
this.bestandListe = liste;
}

private void mainMenue()
{
char eingabe;

do
{
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println(" ################################################################## ");
System.out.println(" # # ");
System.out.println(" # WILKOMMEN IM GOLD-AN-UND-VERKAUF PROGRAMM!!! # ");
System.out.println(" # # ");
System.out.println(" # ZUR ZEIT BEFINDEN SIE SICH IM HAUPTMENUE. # ");
System.out.println(" # BITTE WAEHLEN SIE DEN GEUENSCHTEN MENUEPUNKT DURCH EINGABE DER # ");
System.out.println(" # ENTSPRECHENDEN ZIFFER! # ");
System.out.println(" # ZUM VERLASSEN DES PROGRAMMS WaeHLEN SIE BITTE 'e'. # ");
System.out.println(" # # ");
System.out.println(" ################################################################## ");
System.out.println();
System.out.println();
System.out.println(" *********************** ");
System.out.println(" * H A U P T M E N U E * ");
System.out.println(" *********************** ");
System.out.println();
System.out.println(" ****************************** ");
System.out.println(" * [1] BESTANDSVERWALTUNG * ");
System.out.println(" * * ");
System.out.println(" * [2] KUNENVERWALTUNG * ");
System.out.println(" * * ");
System.out.println(" * [3] DATENVERWALTUNG * ");
System.out.println(" * * ");
System.out.println(" * [e] EXIT * ");
System.out.println(" ****************************** ");
System.out.println();
System.out.println();

System.out.print("MENUEPUNKT AUSWAEHLEN UND MIT 'ENTER' BESTAETIGEN!\n");
eingabe = Stdin.readlnChar("MENUEPUNKT:");

switch (eingabe)
{
case 'e': System.out.println("DAS PROGRAMM WURDE BEENDET! BITTE FENSTER SCHLIEßEN!");
exit();

case '2': kundenverwaltung();
break;
case '3': datenverwaltung();
break;
default: System.out.print("MENUEPUNKT NICHT VORHANDEN! BITTE WAEHLEN SIE EINEN DER AUFGEFUEHRTEN MENUEPUNKTE!\n");
}
} while (true);
}

private void bestandsverwaltung()
{
char eingabe;
boolean menuewechsel = false;
do
{
System.out.println();
System.out.println("WILKOMMEN IN DER BESTANDVERWALTUNG!");
System.out.println("SIE KOENNEN SICH IHRE BESTaeNDE ANSEHEN SOWIE AENERUNGEN AN IHNEN VORNEHMEN.");
System.out.println();
System.out.println(" ***************************************");
System.out.println(" * B E S T A N S D V E R W A L T U N G *");
System.out.println(" ***************************************");
System.out.println(" ****************************************************************************");
System.out.println(" * [1] ANEZIGEN ALLER GOLDARTIKEL [6] VERKAUFPREIS BERECHNUNG *");
System.out.println(" * *");
System.out.println(" * [2] ANZEIGEN ALLER HALSKETTEN [7] VERKAUFE ARTIKEL *");
System.out.println(" * *");
System.out.println(" * [3] ANZEIGEN ALLER RINGE [8] ARTIKEL SUCHEN *");
System.out.println(" * *");
System.out.println(" * [4] ANZEIGEN DES GESAMTEN BESTANDS [9] ARTIKEL HINZUFUEGEN *");
System.out.println(" * *");
System.out.println(" * [5] ARTIKEL ANKAUFEN [z] ZURUECK *");
System.out.println(" ****************************************************************************");
System.out.println();
System.out.println();

System.out.print("MENUEPUNKT AUSWAEHLEN UND MIT 'ENTER' BESTAETIGEN!\n");
eingabe = Stdin.readlnChar("MENUEPUNKT:");

switch(eingabe)
{

case 'z': menuewechsel = true;
break;
case '1': getGoldartikelBestand();
break;

default: System.out.print("MENUEPUNKT NICHT VORHANDEN! BITTE WAEHLEN SIE EINEN DER AUFGEFUEHRTEN MENUEPUNKTE!\n");
}
}while(!menuewechsel);
}

private void datenverwaltung()
{
char eingabe;
boolean menuewechsel = false;
do
{
System.out.println();
System.out.println(" *********************************");
System.out.println(" * D A T E N V E R W A L T U N G *");
System.out.println(" *********************************");
System.out.println();
System.out.println(" *************************************");
System.out.println(" * [1] LADE DATEN AUS XML-DATEI *");
System.out.println(" * *");
System.out.println(" * [2] SPEICHERE DATEN IN XML-DATEI *");
System.out.println(" * *");
System.out.println(" * [z] ZURUECK ZUM HAUPTMENUE *");
System.out.println(" *************************************");
System.out.println();

System.out.print("MENUEPUNKT AUSWAEHLEN UND MIT 'ENTER' BESTSETIGEN!\n");
eingabe = Stdin.readlnChar("MENUEPUNKT:");

switch(eingabe)
{
case 'z': menuewechsel = true;
break;
case '1': load();
break;
case '2': save();
break;
default: System.out.print("MENUEPUNKT NICHT VORHANDEN! BITTE WAEHLEN SIE EINEN DER AUFGEFUEHRTEN MENUEPUNKTE!\n");
}
}while (!menuewechsel);
}





public void getGoldartikelBestand()
{
String s;

System.out.println("GOLDARTIKELBESTAND [ARTIKELART 1]");
System.out.println("*********************************");
System.out.println("");
System.out.println("");
printZentriert("GEWICHT");
printZentriert("ART. NR.");
printZentriert("ARTIKELART NR.");
printZentriert("PREIS");
printZentriert("GOLDTYP");
System.out.println();
printLinieLF(5);

Iterator <Bestand>iter = bestandListe.iterator();
while(iter.hasNext())
{

Bestand i = iter.next();

if (i instanceof Goldartikel)
{
s = castDouble2String(i.getGewicht());
printRechtsbuendig(s);

s = castInt2String(i.getArtikelnummer());
printRechtsbuendig(s);

s = castInt2String(i.getArtikelart());
printRechtsbuendig(s);

s = castDouble2String(i.getPreis());
printRechtsbuendig(s);

printRechtsbuendig(Goldtyp.A.getNr());

System.out.println();

}
}
System.out.println();

}






private String castInt2String(int meinInt)
{
return Integer.toString(meinInt);
// die obige Zeile ist von der Funktion identisch zu
// Integer i = new Integer(meinInt);
// return i.toString();
}

private String castDouble2String(double meinDouble)
{
// hier nutzen wir die Format-Anweisung der Klasse String um die Nachkommastellen zu bestimmen etc.
return String.format("%,8.2f", meinDouble);
}

private void printZentriert(String s)
{
System.out.print(baueZentriertenString(s, FELDLAENGE));
}

private void printLinksbuendig(String s)
{
System.out.print(baueLinksbuendigenString(s, FELDLAENGE));
}

private void printRechtsbuendig(String s)
{
System.out.print(baueRechtsbuendigenString(s, FELDLAENGE));
}

private void printLinieLF(int anzahlFelder)
{
/* Besonderheit: hier Nutzung des StringBuilders statt direkt mit String zu arbeiten.
* Ist sparsamer im Umgang mit Speicher.
*/
StringBuilder s = new StringBuilder();
int laenge = anzahlFelder*(FELDLAENGE+3);
for (int i=1;i<=laenge;i++)
{
s=s.append("-");
}
System.out.println(s);
}

private String baueZentriertenString(String s, int laenge)
{
// wir entfernen Leerzeichen am Anfang und Ende des Strings
s.trim();
// falls der String zu lang ist, kuerzen wir ihn
if (s.length() > laenge)
{
s.substring(0, laenge);
}
else
{
int differenzLinks = (laenge - s.length())/2;
for (int i=1;i<=differenzLinks;i++) s=" "+s+" ";
if (s.length()<laenge) s=s+" ";
}

return s+" | ";
}

private String baueRechtsbuendigenString(String s, int laenge)
{
// wir entfernen Leerzeichen am Anfang und Ende des Strings
s.trim();
// falls der String zu lang ist, kuerzen wir ihn
if (s.length() > laenge)
{
s.substring(0, laenge);
}
else
{
int differenzLinks = (laenge - s.length());
for (int i=1;i<=differenzLinks;i++) s=" "+s;
}

return s+" | ";
}

private String baueLinksbuendigenString(String s, int laenge)
{
// wir entfernen Leerzeichen am Anfang und Ende des Strings
s.trim();
// falls der String zu lang ist, kuerzen wir ihn
if (s.length() > laenge)
{
s.substring(0, laenge);
}
else
{
int differenz = (laenge - s.length());
for (int i=1;i<=differenz;i++) s=s+" ";
}

return s+" | ";
}

/**
* Zeigt Informationen zum Programm.
*/

private void printProgrammInfo()
{
System.out.println("");
System.out.println("");
System.out.println("");
System.out.println("");
}

/**
* Statische Main Methode zum starten ohne ein Objekt erzeugen zu müssen.
* @param args
*/
public static void main(String[] args)
{
Verwaltungseinheit v = new Verwaltungseinheit();

v.initData();
v.printProgrammInfo();
v.mainMenue();
}
}


[/code]

Abstrakte Klasse Bestand:
------------------------


[JAVA=42]
public abstract class Bestand
{
private static int artikelnummerGen = 2000;
private int artikelnummer;
private double gewicht;
private int artikelart;
private double preis;


/**
* Standardkonstruktor
*/

public Bestand()
{
}

/**
* Konstruktor der Klasse Goldartikel.
* Übergabe von 2 Parameter übergeben.
* @param gewicht Gewicht des Artikels.
* @param goldtyp Goldtyp des Artikels.
*/

public Bestand(double gewicht, int artikelart, double preis)
{
this.gewicht = gewicht;
this.artikelart = artikelart;
this.preis = preis;
this.artikelnummer = artikelnummerGen;
artikelnummerGen++;


}

/**
* @param preis Preis
*/

public void setPreis(double preis)
{
this.preis = preis;
}

/**
* @return preis Preis
*/

public double getPreis()
{
return this.preis;
}

/**
* @param artilekart Artikelart
*/

public void setArtikelart(int artikelart)
{
this.artikelart = artikelart;
}

/**
* @return artikelart Artikelart
*/

public int getArtikelart()
{
return this.artikelart;
}

/**
* @param artikelnummer Artikelnummer
*/

public void setArtikelnummer(int artikelnummer)
{
this.artikelnummer = artikelnummer;
}

/**
* @return artikelnummer Artikelnummer
*/

public int getArtikelnummer()
{
return this.artikelnummer;
}

/**
* @param gewicht Gewicht des Artikels
*/

public void setGewicht(double gewicht)
{
this.gewicht = gewicht;
}

/**
* @return gewicht Gewicht des Artikels
*/

public double getGewicht()
{
return this.gewicht;
}
[/code]

Klasse Goldartikel:
----------------

[JAVA=42]

public class Goldartikel extends Bestand
{
private Goldtyp goldtyp;

public Goldartikel()
{
}

public Goldartikel(double gewicht, int artikelart, double preis, Goldtyp goldtyp)
{
super(gewicht, artikelart, preis);
this.goldtyp = goldtyp;
}
}

[/code]

enum Klasse Goldtyp:
-------------------

[JAVA=42]
/**
* Diese Klasse "Goldtyp" wird ist vom Typ Enumeration.
* Sie wird von den Klassen Goldartikel, Ring und Halskette genutzt.
* Die definiert damit gültige Typen von Goldartikeln, Ringen und Halsketten.
*/

public enum Goldtyp
{
/**
* Auflistung der gültigen Goldtypen.
* Bei Bedarf können neue hinzugefügt werden.
*/

A("333"),

B("555"),

C("777");

private String nr;

/**
* Im Folgenden sind die Instanzvariabeln definiert.
* Bei Klassen vom Typ Enum werden diese erst hiner der Aufzählung der
* gültigen Typen aufgeführt.
*/

Goldtyp(String nr)
{
this.nr = nr;

}

String getNr()
{
return nr;
}
}
[/code]

So sieht es immer aus:

GEWICHT | ART. NR. | ARTIKELART NR. | PREIS | GOLDTYP |

-------------------------------------------------------------------------------------

10,00 | 2000 | 1 | 50,00 | 333 |

12,00 | 2001 | 1 | 60,00 | 333 |

9,00 | 2002 | 1 | 100,00 | 333 |

4,00 | 2003 | 1 | 300,00 | 333 |



Und so sollt es aussehen:

GEWICHT | ART. NR. | ARTIKELART NR. | PREIS | GOLDTYP |

-------------------------------------------------------------------------------------

10,00 | 2000 | 1 | 50,00 | 333 |

12,00 | 2001 | 1 | 60,00 | 555 |

9,00 | 2002 | 1 | 100,00 | 333 |

4,00 | 2003 | 1 | 300,00 | 555 |


Tabelle ist ein bissel verrutscht!

Ich wär sehr froh, wenn Ihr mir helfen könntet!!!!!
 
Kein Wunder bei
Java:
printRechtsbuendig(Goldtyp.A.getNr());

Erstelle in Goldartikel einen Getter für den Goldtyp und rufe dann [c]printRechtsbuendig(((Goldartikel) i).getGoldtyp().getNr());[/c]o.ä. auf
 
Kein Wunder bei
Java:
printRechtsbuendig(Goldtyp.A.getNr());

Erstelle in Goldartikel einen Getter für den Goldtyp und rufe dann [c]printRechtsbuendig(((Goldartikel) i).getGoldtyp().getNr());[/c]o.ä. auf


Vielen, vielen Dank!!!!!! Es funktioniert!!!!!:applaus::applaus::applaus::applaus::applaus::applaus::toll::toll::toll:
 
Hallo Leute!

Der Tip den ich von Basti bekommen habe, funktioniert wunderbar. Alles läuft wie ich es mir vorstelle.
Nun kann ich zwar alles in eine XML Datei speichern aber sobald ich die XML Datei lade und mir den Bestand anleigen lassen will, kommt folgende Meldung:

-------------------------------------------------------------------------------
Exeption in thread "main" java.lang.Null.PointerException

at Bestand.getGoldpreis(Bestand.java:75)

at Verwaltungseinheit.getGoldartikelbestand(Verwaltungseinheit.java:596)

at Verwaltungseinheit.bestandsverwaltung(Verwaltungseinheit.java:244)

at Verwaltungseinheit.mainMenue(Verwaltungseinheit.java:191)

at Verwaltungseinheit.load(Verwaltungseinheit.java:111)

at Verwaltungseinheit.datenverwaltung(Verwaltungseinheit.java:302)

at Verwaltungseinheit.mainMenue(Verwaltungseinheit.java:195)

at Verwaltungseinheit.main(Verwaltungseinheit.java:1364)

-------------------------------------------------------------------------

Ich vermute, dass es irgendwie mit der ENUM Klasse zusammenhängt. Wenn ich nichts speichern oder laden will ist alles wunderbar. Aber sobald ich speichere und den Goldartikelbestand lade knallts. Und dafür muss ich nicht erst etwas in den Bestand eingefügt haben.

Ich poste mal die Quelltexte der einzelnen Klassen. Vielleicht findet jemand den Fehler. Danke schon mal im Vorraus für Eure Mühe!!! 😉😉😉

Die Verwaltungsklasse, welche die Main Methode hat (etwas gekürzt):
--------------------------------------------------

Java:
 public void getGoldartikelBestand()
    {
        String s;

        System.out.println("GOLDARTIKELBESTAND [ARTIKELART 1]");
        System.out.println("*********************************");
        System.out.println("");
        System.out.println("");
        printZentriert("ARTIKELNUMMER");
        printZentriert("GEWICHT");
        printZentriert("GOLDPREIS");
        printZentriert("ANKAUFPREIS");
        printZentriert("VERKAUFPREIS");
        printZentriert("ANKAUFSPREIS");
        printZentriert("VERKAUFSPREIS");

        System.out.println();
        printLinieLF(7);

        Iterator <Bestand>iter = bestandListe.iterator();
        while(iter.hasNext())
        {

            Bestand i = iter.next();

            if (i instanceof Goldartikel) 
            {
                s = castInt2String(i.getArtikelnummer());
                printRechtsbuendig(s);

                s = castDouble2String(i.getGewicht());
                printRechtsbuendig(s);

                s = castDouble2String(i.getGoldpreis());           <------- ab hier kommt der Fehler!!!
                printRechtsbuendig(s);

                s = castDouble2String(i.getAnkaufpreis());
                printRechtsbuendig(s);

                s = castDouble2String(i.getVerkaufpreis());
                printRechtsbuendig(s);

                System.out.println();

            }
        }
        System.out.println();

    }

    private void neuenGoldartikel()
    {

        double gewicht = Stdin.readlnDouble("GEWICHT:");
        double goldpreis = 0;
        double ankaufpreis = 0;
        double verkaufpreis = 0;

        System.out.println();
        System.out.println("WELCHE ART VON GOLDTYP WOLLEN SIE HINZUFUEGEN?");
        System.out.println();
        System.out.println("EINGABE [A] FÜR GOLDTYP 333");
        System.out.println("EINGABE [B] FÜR GOLDTYP 555");
        System.out.println("EINGABE [code] FÜR GOLDTYP 777");
        System.out.println();

        char goldtyp = Stdin.readlnChar("GOLDTYP:");

        switch(goldtyp)
        {

            case 'A':  

            bestandListe.add(new Goldartikel(gewicht, goldpreis, ankaufpreis, verkaufpreis, Goldtyp.A)); 
            System.out.println();
            System.out.println("GOLDTYP VOM TYP 333 HINZUGEFÜGT");
            System.out.println();
            break;

            case 'B': 

            bestandListe.add(new Goldartikel(gewicht, goldpreis, ankaufpreis, verkaufpreis, Goldtyp.B));
            System.out.println();
            System.out.println("GOLDTYP VOM TYP 555 HINZUGEFÜGT");
            System.out.println();
            break;

            case 'C': 

            bestandListe.add(new Goldartikel(gewicht, goldpreis, ankaufpreis, verkaufpreis, Goldtyp.C));
            System.out.println();
            System.out.println("GOLDTYP VOM TYP 777 HINZUGEFÜGT");
            System.out.println();
            break;
            default: System.out.print("UNBEKANNTE EINGABE!");
            System.out.println();
        }

    }
[/Java]

Abstrakte Klasse Bestand:
-------------------------

[code=Java]
public abstract class Bestand
{
    private static int artikelnummerGen = 2000;    
    private int artikelnummer;
    private double gewicht;
    private double goldpreis;
    private double ankaufpreis;
    private double verkaufpreis;

    public Bestand()
    {
    }

    /**
     * Konstruktor der Klasse Goldartikel.
     * Übergabe von 2 Parameter übergeben.
     * @param gewicht Gewicht des Artikels.
     * @param goldtyp Goldtyp des Artikels.
     */

    public Bestand(double gewicht, double goldpreis, double ankaufpreis, double verkaufpreis)
    {
        this.gewicht = gewicht;
        this.goldpreis = goldpreis;
        this.ankaufpreis = ankaufpreis;
        this.verkaufpreis = verkaufpreis;

        this.artikelnummer = artikelnummerGen;
        artikelnummerGen++;

    }

    /**
     * @param gewicht Gewicht des Artikels
     */

    public void setGewicht(double gewicht)
    {
        this.gewicht = gewicht;
    }

    /**
     * @return gewicht Gewicht des Artikels
     */

    public double getGewicht()
    {
        return this.gewicht;
    }

    public abstract Goldtyp getGoldtyp();

    public double getGoldpreis()
    {
        this.goldpreis = this.gewicht*getGoldtyp().getGrammpreis();
        return this.goldpreis;
    }

    public double getAnkaufpreis()
    {
        this.ankaufpreis = (this.gewicht*getGoldtyp().getGrammpreis()*0.5);
        return this.ankaufpreis;
    }

    public double getVerkaufpreis()
    {
        this.verkaufpreis = (this.gewicht*getGoldtyp().getGrammpreis()*1.5);
        return this.verkaufpreis;
    }

    /**
     * @param artikelnummer Artikelnummer
     */

    public void setArtikelnummer(int artikelnummer)
    {
        this.artikelnummer = artikelnummer;
    }

    /**
     * @return artikelnummer Artikelnummer
     */

    public int getArtikelnummer()
    {
        return this.artikelnummer;
    }

}

Die emum KLasse:
----------------

Java:
/**
 * Diese Klasse "Goldtyp" wird ist vom Typ Enumeration.
 * Sie wird von den Klassen Goldartikel, Ring und Halskette genutzt.
 * Die definiert damit gültige Typen von Goldartikeln, Ringen und Halsketten. 
 */

public enum Goldtyp
{
    /**
     * Auflistung der gültigen Goldtypen.
     * Bei Bedarf können neue hinzugefügt werden.
     */

    A(333, 10.13),

    B(585, 18.44),

    C(999, 31.71);

    private int nr;
    private double grammpreis;

    /**
     * Im Folgenden sind die Instanzvariabeln definiert.
     * Bei Klassen vom Typ Enum werden diese erst hiner der Aufzählung der
     * gültigen Typen aufgeführt.
     */

    Goldtyp(int nr, double grammpreis)
    {
        this.nr = nr;
        this.grammpreis = grammpreis;
    }

    int getNr()
    {
        return this.nr;
    }

    double getGrammpreis()
    {
        return this.grammpreis;
    }

}

Die Klasse Goldartikel:
--------------------

Java:
public class Goldartikel extends Bestand
{
    private Goldtyp goldtyp;

    public Goldartikel()
    {
    }

    public Goldartikel(double gewicht, double goldpreis, double ankaufpreis, double verkaufpreis, Goldtyp goldtyp)
    {
        super(gewicht, goldpreis, ankaufpreis, verkaufpreis);
        this.goldtyp = goldtyp;
    }

    public Goldtyp getGoldtyp()
    {
        return tgoldtyp;
    }

}

So sieht die XML aus:
--------------------

Java:
<?xml version="1.0" encoding="UTF-8" ?> 
- <java version="1.6.0_23" class="java.beans.XMLDecoder">
  <string>Softwareprojekt</string> 
- <object class="Verwaltungseinheit">
- <void property="bestandListe">
- <void method="add">
- <object class="Goldartikel">
- <void property="artikelnummer">
  <int>2000</int> 
  </void>
- <void property="gewicht">
  <double>10.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Goldartikel">
- <void property="artikelnummer">
  <int>2001</int> 
  </void>
- <void property="gewicht">
  <double>12.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Goldartikel">
- <void property="artikelnummer">
  <int>2002</int> 
  </void>
- <void property="gewicht">
  <double>9.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Goldartikel">
- <void property="artikelnummer">
  <int>2003</int> 
  </void>
- <void property="gewicht">
  <double>4.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Halskette">
- <void property="artikelnummer">
  <int>2004</int> 
  </void>
- <void property="gewicht">
  <double>8.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Halskette">
- <void property="artikelnummer">
  <int>2005</int> 
  </void>
- <void property="gewicht">
  <double>15.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Halskette">
- <void property="artikelnummer">
  <int>2006</int> 
  </void>
- <void property="gewicht">
  <double>13.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Halskette">
- <void property="artikelnummer">
  <int>2007</int> 
  </void>
- <void property="gewicht">
  <double>15.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Ring">
- <void property="artikelnummer">
  <int>2008</int> 
  </void>
- <void property="gewicht">
  <double>4.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Ring">
- <void property="artikelnummer">
  <int>2009</int> 
  </void>
- <void property="gewicht">
  <double>5.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Ring">
- <void property="artikelnummer">
  <int>2010</int> 
  </void>
- <void property="gewicht">
  <double>8.0</double> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Ring">
- <void property="artikelnummer">
  <int>2011</int> 
  </void>
- <void property="gewicht">
  <double>10.0</double> 
  </void>
  </object>
  </void>
  </void>
- <void property="kundenListe">
- <void method="add">
- <object class="Kunde">
- <void property="kundennummer">
  <int>2000</int> 
  </void>
- <void property="name">
  <string>Heinz</string> 
  </void>
- <void property="telefonnummer">
  <string>0680 674635</string> 
  </void>
- <void property="vorname">
  <string>Becker</string> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Kunde">
- <void property="kundennummer">
  <int>2001</int> 
  </void>
- <void property="name">
  <string>Karl</string> 
  </void>
- <void property="telefonnummer">
  <string>948 37736</string> 
  </void>
- <void property="vorname">
  <string>Guenter</string> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Kunde">
- <void property="kundennummer">
  <int>2002</int> 
  </void>
- <void property="name">
  <string>Alfered</string> 
  </void>
- <void property="telefonnummer">
  <string>0495 837485</string> 
  </void>
- <void property="vorname">
  <string>Meier</string> 
  </void>
  </object>
  </void>
- <void method="add">
- <object class="Kunde">
- <void property="kundennummer">
  <int>2003</int> 
  </void>
- <void property="name">
  <string>Florian</string> 
  </void>
- <void property="telefonnummer">
  <string>0463 78473</string> 
  </void>
- <void property="vorname">
  <string>Sauer</string> 
  </void>
  </object>
  </void>
  </void>
  </object>
  </java>
 
Ich vermute mal, die Zeile 75 in Bestand ist
Java:
     this.goldpreis = this.gewicht*getGoldtyp().getGrammpreis();

Also liefert wahrscheinlich getGoldtyp() null (was du leicht mit einen System.out.println klären kannst). Nun handelt es sich dabei um eine abstrakte Methode. In GoldArtikel sieht alles super aus, also würde ich spontan darauf tippen, dass dein normaler Artikel dort null liefert. Wenn dem so ist fragt man sich natürlich, warum für einen normalen Artikel diese Methode überhaupt aufgerufen wird...
 
Ich vermute mal, die Zeile 75 in Bestand ist
Java:
     this.goldpreis = this.gewicht*getGoldtyp().getGrammpreis();

Also liefert wahrscheinlich getGoldtyp() null (was du leicht mit einen System.out.println klären kannst). Nun handelt es sich dabei um eine abstrakte Methode. In GoldArtikel sieht alles super aus, also würde ich spontan darauf tippen, dass dein normaler Artikel dort null liefert. Wenn dem so ist fragt man sich natürlich, warum für einen normalen Artikel diese Methode überhaupt aufgerufen wird...

Ja, genau diese Zeile ist es, die Probleme macht. Ich hab nur leider kein Wort von dem verstanden, was Du geschrieben hast.
(Bin bin ein absoluter Java Neuling und sitze daran schon 2 Wochen ununterbrochen in jeder freien Minute. Um so frustierter war ich, als ich dachte ich sei endlich fertig und nun klappt das mit dem Laden nicht 🙁🙁🙁 . Was meinst du genau mit "normaler Artikel"?
 
Das ist jetzt nur eine Vermutung: Außer Goldartikel hast du doch sicher auch noch eine andere Klasse, die von Bestand ableitet (sonst brauchst du keine abstrakte Klasse). Diese Klasse muss auch getGoldtyp() implementieren, da die Methode ja abstrakt in Bestand vorgegeben ist. Dort könnte die null herkommen, die zur NullpointerException führt.

Aber ich sehe gerade, dass du für Goldartikel auch einen parameterlosen Konstruktor hast. Wenn du den benutzt, sind natürlich alle Instanzvariablen erst mal null.

Um es ganz einfach zu machen: Packe mal ein paar Ausgaben in Bestand.getGoldpreis(), etwa:

Java:
    public double getGoldpreis()
    {
        System.out.println("Klasse :" + this.getClass()); 
        System.out.println("Gewicht :" + this.gewicht); 
        System.out.println("GoldTyp :" + getGoldtyp()); 
        this.goldpreis = this.gewicht*getGoldtyp().getGrammpreis();
        System.out.println("fertig gerechnet");
        return this.goldpreis;
    }

Die letzte Ausgabe, wo das "fertig gerechnet" nicht kommt, sondern die NullPointerException, sollte dir sagen, was falsch ist. Dann musst du nur noch das "warum?" klären.

Das ist übrigens der ganz große Nachteil von null: Es kracht nicht da, wo eine null fälschlich zugewiesen wird, sondern erst später bei der Verwendung. Selbt der "Erfinder" der Nullreferenz hält sie inzwischen für eine schlechte Idee. Bei deinem Design sollte jederzeit glasklar sein, welche Werte null werden dürfen, und was null in diesen Fällen bedeutet.
 

Zurück
Oben