# Anfänger-Übung für Arrays



## KnoLLe (24. Apr 2010)

Hallo,
ich bearbeite gerade eine (freiwillige) Übung zu Arrays. Ich fasse diese mal kurz zusammen:

-Ein Adressbuch-Objekt das in einem Array mehrere Person-Objekte (die haben erstmal nur Name/Vorname) speichern soll, wobei die Anfangsgröße des Arrays als Parameter des Konstruktors übergeben wird.

-Eine Methode addPerson(), die ein Person an die nächste freie Stelle schreibt. Um diese Stelle zu ermitteln, bekommt das Adressbuch ein Attribut, welches den Index des nächsten noch unbelegten Array-Elements repräsentiert. Dieses Attribut muss natürlich bei Veränderungen aktualisiert werden.

-Prüfen ob der Array bereits voll ist. Wenn ja, soll ein neuer Array doppelter Größe angelegt und der alte Array dort hineinkopiert werden. Dieses Verdoppeln soll in eine eigene private Methode ausgelagert werden.

-Methode getEntriesAsString().
Die erste Zeile enthält eine Information über die Anzahl der Einträge und die aktuelle Kapazität des Adressbuchs,also etwa "3 of 10". Die anderen Zeilen bestehen aus den Rückgabewerten von Aufrufen der Methode getPersonAsString() auf den einzelnen Personen.

Mein bisheriges Programm:


```
package AddressBook;

public class AddressBookTest {
    public static void main(String[] args) {
        // create person
        
        Person p1 = new Person("Name1", "Nachname1");
        Person p2 = new Person("Name2", "Nachname2");
        Person p3 = new Person("Name3", "Nachname3");
        Person p4 = new Person("Name4", "Nachname4");
        Person p5 = new Person("Name5", "Nachname5");

        // create addressbook and fill in person
        ArrayAddressBook book = new ArrayAddressBook(2);
        book.addPerson(p1);
        book.addPerson(p2);
        book.addPerson(p3);
        book.addPerson(p4);
        book.addPerson(p5);        

        // fetch person from book and print it
        book.getEntriesofString();
        
    }
}
```


```
package AddressBook;

/**
 *
 * @author Julian
 */
public class Person {
    String vorname;
    String nachname;

    Person(String vorname, String nachname){
        this.vorname = vorname;
        this.nachname = nachname;
    }

    String getPersonAsString(){
          return vorname+" "+nachname;
    }

}
```


```
package AddressBook;

public class ArrayAddressBook {
   int count;
   Person[] persons;

    ArrayAddressBook(int groesse){
        persons = new Person[groesse];
    }

    void addPerson(Person p){        
        if (count == persons.length)
            verdopple();

        persons[count] = p;
        count++;       
    }

    void verdopple(){
        Person[] doppelArray = new Person[persons.length*2];
        
        for (int i =0; i < persons.length;i++)
            doppelArray[i] = persons[i];
        persons = doppelArray;
    }

    void getEntriesofString(){
        System.out.println(count+" of "+(persons.length));
        for(Person p : persons)
            System.out.println(p.getPersonAsString());
    }
}
```
Problem: Mit 2 Personen gehts, bei 4 wird korrekt verdoppelt, bei mehreren erhalte ich ne Exception:

```
5 of 8
Exception in thread "main" java.lang.NullPointerException
Name1 Nachname1
Name2 Nachname2
        at AddressBook.ArrayAddressBook.getEntriesofString(ArrayAddressBook.java:30)
Name3 Nachname3
        at AddressBook.AddressBookTest.main(AddressBookTest.java:27)
Name4 Nachname4
Name5 Nachname5
```

Seltsamerweise spuckt er sogar bei z.B. 18 von 32 keine weiteren außer die an der Stelle oben aus. Es muss eine Fehler nach den ersten 2/3 Elementen aber ich verstehs einfach nicht...

Wäre toll, wen ihr trotz des Kilometer langem Posts, mir etwas helfen könntet 
Danke!


----------



## eRaaaa (24. Apr 2010)

Das Problem ist die Methode [c]getEntriesofString()[/c] 
Du iterierst dort über das *gesamte* Array. Das Array ist ja aber nie wirklich komplett voll belegt, daher iterierst du auch an eine Stelle die eben [c]null[/c] ist, wenn du dann die Methode [c]p.getPersonAsString()[/c] aufrufen willst, kracht es 

Frage also ab ob p == null ist, und beende dann die Schleife o.ä. ! (bzw du kennst ja count, also iteriere auch nur bis dahin !)


----------



## KnoLLe (24. Apr 2010)

Erstmal danke für die super schnelle Antwort 
Über den Fehler ärgere ich mich wirklich, den Rest habe ich relativ locker erledigt und dann sowas...hatte aber auch ein Verständnisfehler bzgl der for:each Schleife! 

Jetzt kann's weiter gehen :rtfm:


----------

