# Objekt-Array ausgeben



## Guest (25. Okt 2007)

Hallo,

ich möchte mein Objekt-Array ausgeben.
Dachte mir das folgendermaßen:

```
public void printKunde() throws IOException {  
        for (int i = 0; i < kundenFeld.length; i++)
        kundenFeld[i].schreibeKunden();
    }
```

Und die Methode zum ausgeben:

```
public void schreibeKunden() {  
       System.out.println(kundennummer+" "+name+" "+vorname+" "+ anschrift); 
    }
```

als ergebnis bekomm ich immer eine NullPointerException...???
obwohl das feld eigentlich gefüllt ist...


----------



## PollerJava (25. Okt 2007)

Wieviele Konstruktoren hast du in deiner Klasse bzw. wieviel Objekte erzeugst du von dieser Klasse?


----------



## Kim Stebel (25. Okt 2007)

poste den code, der das array füllen soll. oder geh gleich selbst mit nem debugger durch diesen code und schau was schiefläuft.


----------



## Guest (25. Okt 2007)

also beim wird zuerst folgende methode aufgerufen:

```
public void erzeugeKunden(int anzahl) throws IOException { 
        
        kundenFeld = new Kunde[anzahl];
              
        for (int i = 0; i < anzahl; i++) {
            kundenFeld[i] = createKunde();
        }
        Steuerung steuerung = new Steuerung();
        steuerung.menu();
        
    }
```

dann diese...

```
public Kunde createKunde() throws IOException { 
        Kunde kunde = new Kunde();
        this.liesKunde(kunde);
        return kunde; 
    }
```

und dann diese...

```
public void liesKunde(Kunde kunde) throws IOException 
    {
        System.out.println("Kundennummer:"); 
        kunde.setKundennummer(MeineEingabe.erfasseInt());
        System.out.println("Name:");
        kunde.setName(MeineEingabe.erfasseText());
        System.out.println("Vorname:");
        kunde.setVorname(MeineEingabe.erfasseText());
        
        this.liesAnschrift(kunde);    
    }
```

und zu guter letzt die anschrift...

```
public void liesAnschrift(Kunde kunde) throws IOException { //erkennt Datentyp Kunde nicht!!!
        Anschrift anschr = new Anschrift();
        
        System.out.println("Wie lautet die Strasse der Person?"); 
        String strasse = MeineEingabe.erfasseText(); 
        anschr.setStrasse(strasse);
        
        System.out.println("Wie lautet die Hausnummer?"); 
        String hausnummer = MeineEingabe.erfasseText();  
        anschr.setHausNr(hausnummer);
        
        System.out.println("Wie lautet die Postleitzahl?"); 
        int plz = MeineEingabe.erfasseInt(); 
        while (plz < 10000 || plz > 99999) { 
            System.out.println("Die Postleitzahl darf maximal 5 Stellen haben."); 
            plz = MeineEingabe.erfasseInt();
            anschr.setPlz(plz);
        }
        System.out.println("Wie lautet der Ort?"); 
        String ort = MeineEingabe.erfasseText();
        anschr.setOrt(ort);
        
         
    }
```


----------



## Murray (25. Okt 2007)

Ich nehme an, erzeugeKunden wird auch aufgerufen. Kann es sein, dass debei eine Exception auftritt? Wenn z.B. in liesAnschrift eine IOException auftritt, wird diese immer weiter hochgeworfen und sorgt dafür, dass die Schleife abgebrochen wird.


----------



## Guest (25. Okt 2007)

jo genau erzeugeKunden() wird auch aufgerufen...


----------



## Guest (25. Okt 2007)

aber was soll denn da falsch sein?
ich kapier das nicht.


----------



## Leroy42 (25. Okt 2007)

Anonymous hat gesagt.:
			
		

> als ergebnis bekomm ich immer eine NullPointerException...???



Bevor wir hier weiter sinnlos herumraten, poste die NPE und
zeige die Zeilen im Java-Programm, wo die NPE auftritt
(und ein paar ums sie _herum_)


----------



## Murray (25. Okt 2007)

Anonymous hat gesagt.:
			
		

> aber was soll denn da falsch sein?
> ich kapier das nicht.


Wie gesagt: sollte in der Schleife irgendwo eine IOException kommen, dann wird die Schleife abgebrochen, und dadurch bleiben die restliche Array-Element uninitialisiert.


----------



## Guest (25. Okt 2007)

```
public void printKunde() throws IOException { 
        for (int i = 0; i < kundenFeld.length; i++)  //<=== dort tritt sie auf
        kundenFeld[i].schreibeKunden();
    }
```

und so sieht die exception aus..

```
Exception in thread "main" java.lang.NullPointerException
        at ueb1.Kunde.printKunde(Kunde.java:163)
        at ueb1.Steuerung.menu(Steuerung.java:40)
        at ueb1.Kunde.erzeugeKunden(Kunde.java:134)
        at ueb1.Steuerung.menu(Steuerung.java:37)
        at ueb1.VererbungenMain.main(VererbungenMain.java:14)
Java Result: 1
```


----------



## Murray (25. Okt 2007)

Mach mal nur zur Sicherheit etwas "poor man's debugging":

```
public void printKunde() throws IOException {

        System.out.println( getClass().getName() + ".printKunde: kundenFeld=" + kundenFeld);


        for (int i = 0; i < kundenFeld.length; i++)  {
           System.out.println( getClass().getName() + ".printKunde: kundenFeld[" + i + "]=" + kundenFeld[i]);
            kundenFeld[i].schreibeKunden();
        }
    }
```


Mich wundert der StackTrace etwas: aus erzeugeKunde über den Umweg Steuerung.menu nach printKunde ?? Das gibt der gepostete Code so nicht her.


----------



## Leroy42 (25. Okt 2007)

```
for (int i = 0; i < kundenFeld.length; i++)  //<=== dort tritt sie auf
```

Na dass ist doch mal eindeutig: _kundenFeld_ ist null

Wo wird _kundenFeld_ denn initialisiert?


----------



## Guest (25. Okt 2007)

naja nachdem der kunde erzeugt wurde, wird wieder das menü (steuerung) aufgerufen.
und dann wird von da aus printKunde aufgerufen


----------



## Guest (25. Okt 2007)

kundenFeld[] wird in der methode erzeugeKunde() initialisiert.
siehe oben^^


----------



## Guest (25. Okt 2007)

nachdem poo men dubugging kommt folgende exception:

```
Exception in thread "main" java.lang.NullPointerException
ueb1.Kunde.printKunde: kundenFeld=null                         <<<======
        at ueb1.Kunde.printKunde(Kunde.java:173)
        at ueb1.Steuerung.menu(Steuerung.java:40)
        at ueb1.Kunde.erzeugeKunden(Kunde.java:135)
        at ueb1.Steuerung.menu(Steuerung.java:37)
        at ueb1.VererbungenMain.main(VererbungenMain.java:14)
Java Result: 1
```


----------



## Murray (25. Okt 2007)

Anonymous hat gesagt.:
			
		

> naja nachdem der kunde erzeugt wurde, wird wieder das menü (steuerung) aufgerufen.
> und dann wird von da aus printKunde aufgerufen


So eine Programmsteuerung würde ich mir schnell abgewöhnen - dein ganzes Programm besteht so aus einer Kette von Sprüngen in Unterfunktionen, zu denen es keine Rücksprünge gibt - irgendwann läuft da der Stack über. Aber das kann hier nicht die Fehlerursache sein.

Wird kundenFeld irgendwo anders im Programm nochmal zugewiesen?


----------



## Leroy42 (25. Okt 2007)

Anonymous hat gesagt.:
			
		

> kundenFeld[] wird in der methode erzeugeKunde() initialisiert.
> siehe oben^^



Kann es sein, dass du in der print-Methode auf ein
völlig anderes _kundenFeld_ zugreifst, als das,
das du initialisiert hast?


----------



## Murray (25. Okt 2007)

Ist kundenFeld vielleicht statisch?

Und steht im Konstruktor der Klasse vielleicht etwas wie kundenFeld = null?


----------



## Guest (25. Okt 2007)

vielleicht noch folgendes, so schaut das menü aus:


```
public class Steuerung {
    Kunde kunde = new Kunde();
    
    public void menu() throws IOException {
    System.out.println ("KUNDENDATENBANK"); 
        System.out.println ("**************************************"); 
        System.out.println ("1. 10 Muster-Kunden einlesen"); 
        System.out.println ("2. Einzelnen Kunden erfassen");
        System.out.println ("3. 10 Stammkunden einlesen");
        System.out.println ("4. Einzelnen Stammkunden erfassen");
        System.out.println ("5. Kunde ausgeben"); 
        System.out.println ("6. Stammkunde ausgeben");  
        System.out.println ("7. Ende"); 
        System.out.println ("**************************************\n");
        
        int zahl = MeineEingabe.erfasseInt();
        
        switch (zahl) { 
            case 1: kunde.erzeugeKunden(10); break;
            case 2: kunde.erzeugeKunden(1);  // 
            case 3: kunde.erzeugeStammKunden(10); break;
            case 4: kunde.erzeugeStammKunden(1); break;
            case 5: kunde.printKunde(); break; //funzt
            case 6: kunde.printStammKunde(); break; 
            case 7: 
                System.out.println("Programmende!"); 
                System.exit(0); 
        }
        

    }
}
```


----------



## Murray (25. Okt 2007)

Du erzeugst am Ende eienr Methode ja immer ein neues "Steuerung"-Objekt - und damit auch einen neuen Kunden. Wie schon gesagt, die Programmsteuerung ist eher suboptimal - auf die Schnelle könntest du es zum Laufen bringen, indem du das "Steuerung"-Objekt in die Methoden durchreichst, also in etwa:

```
public class Steuerung {
    Kunde kunde = new Kunde();
   
    public void menu() throws IOException {
    System.out.println ("KUNDENDATENBANK");
        System.out.println ("**************************************");
        System.out.println ("1. 10 Muster-Kunden einlesen");
        System.out.println ("2. Einzelnen Kunden erfassen");
        System.out.println ("3. 10 Stammkunden einlesen");
        System.out.println ("4. Einzelnen Stammkunden erfassen");
        System.out.println ("5. Kunde ausgeben");
        System.out.println ("6. Stammkunde ausgeben"); 
        System.out.println ("7. Ende");
        System.out.println ("**************************************\n");
       
        int zahl = MeineEingabe.erfasseInt();
       
        switch (zahl) {
            case 1: kunde.erzeugeKunden(10, this); break;
            case 2: kunde.erzeugeKunden(1, this);  //
            case 3: kunde.erzeugeStammKunden(10, this); break;
            case 4: kunde.erzeugeStammKunden(1, this); break;
            case 5: kunde.printKunde( this); break; //funzt
            case 6: kunde.printStammKunde( this); break;
            case 7:
                System.out.println("Programmende!");
                System.exit(0);
        }
       

    }
}

public class Kunde {

  public erzeugeKunden( int anzahl, Steuerung st) {
    /* ... */

    st.menu();

  }
  /* ... */

}
```

Dann bleibt aber das Problem des irgendwann überlaufenden Stacks.

Besser also:

```
public class Steuerung {
    Kunde kunde = new Kunde();
   
    public void menu() throws IOException {

      while ( true)
        System.out.println ("KUNDENDATENBANK");
        System.out.println ("**************************************");
        System.out.println ("1. 10 Muster-Kunden einlesen");
        System.out.println ("2. Einzelnen Kunden erfassen");
        System.out.println ("3. 10 Stammkunden einlesen");
        System.out.println ("4. Einzelnen Stammkunden erfassen");
        System.out.println ("5. Kunde ausgeben");
        System.out.println ("6. Stammkunde ausgeben"); 
        System.out.println ("7. Ende");
        System.out.println ("**************************************\n");
       
        int zahl = MeineEingabe.erfasseInt();
       
        switch (zahl) {
            case 1: kunde.erzeugeKunden(10); break;
            case 2: kunde.erzeugeKunden(1);  //
            case 3: kunde.erzeugeStammKunden(10); break;
            case 4: kunde.erzeugeStammKunden(1); break;
            case 5: kunde.printKunde(); break; //funzt
            case 6: kunde.printStammKunde(; break;
            case 7:
                System.out.println("Programmende!");
                System.exit(0);
        }
      }
    }
}
```
In diesem Fall dann natürlich ohne die Aufrufe von Steuerung#menu() am Ende der einzelnen Operationen.


----------



## Guest (26. Okt 2007)

Vielen Dank für die Hilfe!!!


----------



## Guest (26. Okt 2007)

hab letztere der beiden Varianten mal ausprobiert.
nachdem er den kunden eingelesen hat, soll er ja wieder ins menü zurückkommen.
das passiert auch.
aber wenn ich dort jetzt "kunden ausgeben" anwähle, bleibt das menü immer stehen???


----------



## Murray (26. Okt 2007)

Wie seiht denn die Methode Kunde.printKunde jetzt aus? Sind da noch die Ausschreibungen drin? Siehst du diese Ausschreibungen noch in der Konsole?

Grundsätzlich ist es ja nicht falsch, dass das Menü sichtbar bleibt; ich sehe zumindest keinen Code, der es irgendwie "verschwinden lassen" würde.


----------



## Guest (26. Okt 2007)

liegt es nicht an dem while (true)???


----------



## Guest (26. Okt 2007)

achso, nee funktioniert!
musste in der konsoe nur ein bisl hochscrollen, dann hab ich die ausgabe des kunden gesehen. :wink:


----------



## Guest (26. Okt 2007)

wenn ich jetzt die methode so umgestalten möchte, dass genau der kunde angezeigt wird, deren kundennummer man eingibt, wie müsste das ausschauen?


```
public void printKunde() throws IOException {

        for (int i = 0; i < kundenFeld.length; i++)  {
            kundenFeld[i].schreibeKunden();

        }// enf of for
    } //end of method printKunde()
```


----------



## Guest (26. Okt 2007)

habs jetzt so gelöst:

```
public void printKunde() throws IOException {
        
        System.out.println("Kundennummer: ");
        int wert = MeineEingabe.erfasseInt();
             
        for (int i = 0; i < kundenFeld.length; i++)  {
            if (kundenFeld[i].kundennummer == wert)
            kundenFeld[i].schreibeKunden();
        }// enf of for
         
    } //end of method printKunde()
```


----------

