Vererbung NullPointerException

Butterbrot

Aktives Mitglied
Guten Tag Community,

ich versuche mit dieser Klasse eine Verwaltung von sozialen Netzwerken zu bilden.
"AuDList" ist eine generische Klasse, die einwandfrei funktioniert und deren Methoden ich in diese Klasse einbinde. "Account" ist eine größere .jar Datei, die accounts wie in einem Sozialen Netzwerk (Also Name, Alter und in welchen Netzwerk man sich befindet) speichert und ebenfalls einwandfrei funktioniert. Nun versuche ich mit der "AccountCollection" eine Schnittstelle zwischen der beiden zu bilden. Doch sobald ich diese Klasse ausführe erhalte ich einen NullPointer in der "add" Methode und ich weiß nicht woran das liegt. Wäre über jeden Tipp oder Vorschlag dankbar. Danke im Voraus.

P.S.: Um folgende Klasse handelt es sich:

Java:
public class AccountCollection {

    private AuDList<Account> accounts;

    public AccountCollection(){
        AuDList<Account> accounts = new AuDList<Account>();
    }

    public boolean exsists(Account account){
        if(exsists(account)){
            return true;
        }
        else{
            return false;
        }
    }

    public void add(Account account){
        this.accounts.add(account);
    }

    public void remove(Account account){
        this.accounts.remove(account);
    }

    public Account[] getAccounts(){
        Account[] array = new Account[accounts.size()];

        for (Account account : array) {
            int i = 0;
            array[i] = account;
            i++;
        }

        return array;
    }

    public static void main(String[] args) {

        AccountCollection account = new AccountCollection();

        SocialNetwork gesichterbuch = new SocialNetwork("Gesichterbuch");
        Account a = new Account(gesichterbuch, "Herbert Groenemeyer", 56);
        Account b = new Account(gesichterbuch, "Tom Jerry", 27);
        Account c = new Account(gesichterbuch, "AuD Student", 13);

        //        account.add(a);
        //        account.add(b);
        //        account.add(c);
        System.out.println(account.exsists(a));

        ChildrenAccount d = new ChildrenAccount(gesichterbuch, "Kind Eins", 15, a);
        a.addContact(b);
        a.addContact(c);
        TargetGroup tg = new TargetGroup(gesichterbuch);
        tg.addByAgeBetween(14, 55);
        System.out.println(tg);
        System.out.println();
        System.out.println();
        System.out.println(gesichterbuch);

        Account accout = new Account(gesichterbuch, "hiughG", 23);
        for (int i = 0; i < 13; i++) {
            accout.addContact(new Account(gesichterbuch, "hiughG", 23));


        }
    }
}
 
Java:
   public AccountCollection(){
        AuDList<Account> accounts =new AuDList<Account>();
   }

Du erstellst dir im Konstruktor eine neue AuDList, die auch nur im Konstruktor gültig ist.
Du musst deinem bestehendem Attribut aber eine Liste zuweisen.
 
Und wie weiße ich ihm eine Liste zu? Wenn ich das gleiche außerhalb des Konstruktors mache, erhalte ich einen StackOverFlow. Danke im Voraus.
 
Ja, das habe ich vorhin gemerkt und deswegen umgeändert und das "NoSuchMethodError" hat sich aufgehoben. Habe nun "AccountCollection@1b84c92" als Antwort, obwohl meine toString-Methode, in der generischen Klasse das tut was es sollte.
 
Okay, ich entschuldige mich für meine voreiligen Posts ^^. Das kryptische funktioniert auch nicht, weil ich eine toString() angewendet habe. Ich müsste die Methode "getAccounts" anwenden (die ich noch verbessern muss, weil sie nicht das ausgibt was sie sollte)
 
Im Moment ist ein bisschen unklar über welchen Code du redest und was du inzwischen alles geändert hast. Vielleicht kannst du nach der nächsten Änderung mal wieder den aktuellen Code posten und deine Fragen darauf beziehen.
 
Java:
public Account[] getAccounts(){
        Account[] array = new Account[accounts.size()];

        for (Account account : array) {
            int i = 0;
            array[i] = account;
            i++;
        }

        return array;
    }

Ich rede über diese Methode, die ich anwenden hätte sollen und die ich noch verbessern muss um meine angelegten Accounts wiederzugeben. Viel geändert habe ich nicht.
 
Und wo hättest du die anwenden sollen/wollen ? die gibt die Liste der accounts zurück und tut ja eigentlich was man erwarten würde ??!! Naja, d.h. sie tut nicht wirklich was, du iterierst da über ein gerade zuvor angelegtes array das noch nichts enthält.
 
"Harry Kane" hat gefragt, worauf "AccountCollection@1b84c92" ist und das ist nämlich die Antwort auf den Aufruf von "System.out.println(accounts.toString())". Das funktioniert auch nicht, weil das eine Methode der generischen Klasse ist und ungeeignet ist, um meine accounts wiederzugeben. Um meine accounts wiederzugeben müsste ich die Methode "System.out.println(accounts.getAccounts())" verwenden. Diese Methode aber schmeißt mir wieder nur ein Verweis auf meine accounts ("[LAccount;@1b84c92") und zeigt mir nicht meine accounts. Ich entschuldige mich noch einmal an der Stelle für die ganze Verwirrung und meine voreiligen Posts.
 
Ich nehme an du willst deine Accounts ausgeben die in dieser Liste stehen oder:

Code:
private AuDList<Account> accounts;

Gibt es dort denn eine toString()-Methode ? Falls ja, warum machst du in deiner AccountCollection nicht eine vernünftige toString() statt mit der getAccounts herumzumachen ?
Und in deiner Main schreibst du dann:

Code:
 System.out.println(account);
 
Ja, in der generischen Klasse existiert eine toString()-Methode und ja, ich möchte die Accounts ausgeben. Und ich muss das leider so machen. Wird mir vorgegeben
 
Aber die getAccounts ist nicht vorgegeben ?? Was soll die denn tun ? Die liefert ja bis jetzt ein Account[] zurück. Wie willst du die denn ändern ?
 
Naja, "getAccounts()" soll "...ein Array zurückgeben, dass alle Accounts der Sammlung enthält. Dieses
Array soll so groß sein wie die Anzahl der Accounts". Wie ich das konkret machen soll, weiß ich nicht, der einzige Hinweis, der mir gegeben wird ist: "Sie können sich in dieser Teilaufgabe zunutze machen, dass Ihre Liste iterierbar ist"
 
Zuletzt bearbeitet:
Dann musst du die getAccountsw so lassen wie sie ist. Du musst nur ein einziges Wort verändern dann tut sie genau was sie soll. Aber wieso du keine toString() machen darfst verstehe ich immer noch nicht
 
Welches Wort muss ich denn ändern? Ich habe jetzt einfach mal die toString() Methode der generischen Klasse hergenommen und es funktioniert alles 🙂
 
Zuletzt bearbeitet:
Machs mal so:
Code:
public Account[] getAccounts(){
        Account[] array = new Account[accounts.size()];

        for (Account account : accounts) {
            int i = 0;
            array[i] = account;
            i++;
        }

        return array;
    }

Iteriere nicht über dein leeres array sondern über die accounts !!
 
Das ist natürlich noch besser. Mit meinem Ansatz, gibt er zwar ebenfalls alles accounts raus, jedoch wenn ich das mittlere lösche, erscheint das letzte nicht mehr. Mit deiner Vorgehensweise, ist dieses Dilemma behoben. Vielen herzlichen Dank, dass du dir die Zeit und Mühe genommen hast um mir zu helfen 🙂
 
Machs mal so:
Code:
public Account[] getAccounts(){
        Account[] array = new Account[accounts.size()];

        for (Account account : accounts) {
            int i = 0;
            array[i] = account;
            i++;
        }

        return array;
    }

Iteriere nicht über dein leeres array sondern über die accounts !!

Was ist denn das für ein Schwachsinn? So überschreibt er bei jedem Durchlauf der Schleife das erste Feld des Arrays mit der Referenz des jeweils nächsten Accounts...
 
Weil in der Schleife die Variable i immer wieder der Wert 0 zugewiesen wird. So wird immer array[0] angesprochen. Danach wird zwar i erhöht, was aber verpufft, da i wieder auf 0 gesetzt wird.
So wird das Array array nur einen Eintrag haben, auch wenn in accounts mehrere sein sollten.
 
Ach das meint ihr 🙂 Stimmt, das habe ich immer einfach so mitkopiert ohne darauf zu achten. Das gehört natürlich vor die Schleife
 
Java:
    AccountCollection account = new AccountCollection();

        SocialNetwork gesichterbuch = new SocialNetwork("Gesichterbuch");
        Account a = new Account(gesichterbuch, "Herbert Groenemeyer", 56);
        Account b = new Account(gesichterbuch, "Tom Jerry", 27);
        Account c = new Account(gesichterbuch, "AuD Student", 13);
        account.add(a);
        account.add(b);
        account.add(c);
        account.getAccounts();
        account.remove(b);
        System.out.println(account.exsists(b));
        System.out.println(account.exsists(a));
        System.out.println(account.accounts.toString());

Ausgabe:
false
true
[Herbert Groenemeyer
Age: 56
Contacts: NO CONTACTS YET, AuD Student
Age: 13
Contacts: NO CONTACTS YET]

Das gleiche erscheint auch, wenn ich i in der for-Schleife initialisiere.
 
Hallo,
die Änderung betrifft die Methode getAccounts().
Der von dir gepostete Code ruft die Methode zwar auf, da du aber nicht mit der Rückgabe weiterarbeitest, ist es egal, ob du sie aufrufst oder abänderst.
Aktuell tat sie keinen Nutzen.

Die Ausgabe erscheint mir korrekt. Oder was stört dich?
 
Da hast du recht. Aber sobald ich versuche getAccounts() mit einem System.out.println() wiederzugeben erhalte ich nur den Verweis auf das Array. Und da die toString() Methode sich in der anderen Klasse aufhält, weiß ich leider nicht im geringsten, wie ich GLEICHZEITIG getAccounts() aufrufen kann UND das in einen String umwandle. ("System.out.println(account.getAccounts().accounts.toString()" sowas funktioniert natürlich nicht)
 
Was willst du denn mit der Methode getAccounts() genau erreichen?
Die Benennung deutet für mich darauf hin, dass du alle Accounts haben möchtest. Die hast du ja aber schon in deiner AccountCollection account.

Wenn du den Inhalt der Collection ausgeben möchtest, könntest du beispielsweise mit einer Schleife über deine Collection gehen und dir jeden Account ausgeben lassen. Alternativ kannst du in AccountCollection eine Methode schreiben, beispielsweise toString(), und dort deine Einträge zu einem String zusammenfügen. Der Aufruf im zweiten Fall wäre dann System.out.println(account.toString()).

Ich glaube, ich habe das Problem aber nicht verstanden. Vielleicht hilft es dir dennoch.
 
@Butterbrot
getAccounts liefert ein Array vom Typ Account zurück. Diese toString-Methode kannst du nicht überschreiben und wirst über getAccounts().toString() immer nur die Referenz bekommen, die toString eines Arrays ist in Java selbst definiert.
Damit du aber eine Auflistung aller Accounts bekommst, um sie auf der Konsole anzuzeigen, kannst du, wie von Bitfehler bereits geraten, die toString()-Methode der AccountCollection selbst überschreiben.
 
Nun gut, ich habe jetzt eine toString() - Methode geschrieben, die eigentlich nicht verlangt war. So erhalte ich wenigstens, dass was ich wollte. Leider war das in der Aufgabestellung nicht verlangt und ich weiß auch nicht, wie meine Tutoren darauf reagieren werden bzw. das bepunkten werden. Dennoch spreche ich allen meinen Dank aus.
 
Das ist jetzt nur ein Ausschnit. Davor steht noch:
14. Implementieren Sie nun die Funktionsweise der einzelnen Methoden:
a) Der Konstruktor soll die AuDList accounts mit einer neuen Liste initialisieren.
 

Anhänge

Da steht ja nun erstmal gar nichts von einer toString() ..... das brauchst du ja höchstens zum Testen.
Und das i=0; gehört natürlich vor die Schleife. Zum testen würde ja gehören dass du die getAccounts aufrufst und dir dann irgendwie (das ist doch dir überlassen) den Inhalt des zurückgelieferten Arrays anschaust.
 
AccountCollection account = new AccountCollection();
System.out.println(account.accounts.toString());
Das dürfte so gar nicht kompilieren, es sei denn, die accounts-Variable von AccountCollection ist nicht mehr private.
Um Arrays in einen lesbaren String umzuwandeln, gibt es die Methode Arrays.toString(Object[] anArray). Diese ruft für alle Objekte in dem Array deren toString() Methode auf, trennt die einzelnen Strings durch Kommata, und setzt an den Anfang und das Ende eine eckige Klammer.
 

Zurück
Oben