mit Java und Array mit Objekten

Hallo,

ich bin schier am verzweifeln. Ich habe da ein ganz blödes Java-Problem. Am Besten erstmal der gekürzte Code.

Code:
public class PgpSammlerGpgWorker {
	public PgpSammlerKey[] pgpSammlerKey;
        ....
	public void createKeys(){
         for (int i = 0; i < keys.length; i++) {
           pgpSammlerKey = new PgpSammlerKey[keys.length];
           pgpSammlerKey[i] = new PgpSammlerKey();
        }
}

Wenn ich jetzt ausserhalb der Schleife auf die Objekte in PgpSammlerKey[] zugreifen möchte bekomm ich eine Null-Pointer-Exception. Lass ich mir die länge ausgeben passt die. Nur die Objekte sind verschwunden. Wieso? Und vorallem wie kann ich das hinbiegen? Ich glaube ich seh den Fehler einfach nicht.

Gruß odigo
 
Hmm muss das nicht

Code:
public class PgpSammlerGpgWorker {
	public PgpSammlerKey[] pgpSammlerKey;
        pgpSammlerKey = new PgpSammlerKey[keys.length];
        ....
	public void createKeys(){
         for (int i = 0; i < keys.length; i++) {
           pgpSammlerKey[i] = new PgpSammlerKey();
        }
}
heißen :D

Also pgpSammlerKey = new PgpSammlerKey[keys.length]; hochgeschoben :)
 
Nö, daran liegts nicht. Wie gesagt, daß mit der Länge passt ja. Wenn die Klasse instanziert wird steht ja noch nicht fest wie groß das Array werden muss. Innerhalb der Schleife ist das Array richtig gefüllt und ausserhalb ist nur noch das Array da, aber ohne Inhalt. Versteh das nicht.
 
@odigo: auch ausprobiert? ;) Hätte nämlich auch darauf getippt, denn es hat nichts mit der Länge zu tun
Code:
for (int i = 0; i < keys.length; i++) {
           pgpSammlerKey = new PgpSammlerKey[keys.length];  <----
           pgpSammlerKey[i] = new PgpSammlerKey();
        }
Zeile 2 erstellt nämlich bei jedem Schleifendurchgang ein neues Array so dass nach der Schleife nur pgpSammlerKey[keys.length-1] einen gültigen Eintrag hat.
 
Ach herje, das gibts ja nicht. CDW du hast natürlich recht. Das sind die Sachen die die grauen Haare verursachen. Gut daß ich blond bin :P Danke

Gruß odigo
 
Nö, daran liegts nicht. Wie gesagt, daß mit der Länge passt ja. Wenn die Klasse instanziert wird steht ja noch nicht fest wie groß das Array werden muss

Code:
pgpSammlerKey = new PgpSammlerKey[keys.length];

Das muss auf jeden Fall noch vor der Schleife ausgeführt werden, -> der obige Code instanziert noch keine Klasse; legt nur ein Array mit Referenzen vom Typ PgpSammlerKey an. (und die Größe des Arrays scheinst du ja schon vor der Schleife zu wissen; -> da du in der Schleifenbedingung auf key.length() abprüfst; was ja der Arraygröße entspricht) ->

Code:
pgpSammlerKey[i] = new PgpSammlerKey();

Erst hier wird eine Klasse instanziert und der Referenz im Array zugewiesen.

Wenn du jedes mal in der For-Schleife

Code:
pgpSammlerKey = new PgpSammlerKey[keys.length];

machst wird doch nach jedem Durchlauf Speicher für die PgpSammlerKey (Größe keys.length) angelegt. -> dann wird dem i-tem Array eine instanzierte Klasse zugewiesen. -> ABER: Beim nächsten Schleifendurchlauf machst du dein vorher angelegtes Array durch den Aufruf

Code:
pgpSammlerKey = new PgpSammlerKey[keys.length];

wieder kaputt. (Wird am Ende der Methode vom GC eingesammelt) ->

Also was ich sagen will, laut deinem Code kannst du nach der Abarbeitung der Methode nur auf key.length-1-Element deines Array zugreifen. -> weil Rest vom GC eingesammelt wurde.

Zeig mal bitte bischen mehr vom Code, vielleicht können wir dann den Fehler finden :)
 
Zurück
Oben