Lernpfad:Objektorientierte Programmierung mit Java/Komplexe Arrays: Unterschied zwischen den Versionen
Jneug (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „{{Navigation}} == Objektarrays == Arrays können nicht nur primitive Datentypen speichern, sondern auch komplexe Typen - also Objekte. Jedes Element ist dann…“) |
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 18: | Zeile 18: | ||
[[Datei:Java Objektarray.jpg|center|600px]] | [[Datei:Java Objektarray.jpg|center|600px]] | ||
Eine Änderung an dem Objekt <code>r1</code> kann hier mit <code>wuerfel[1]</code> oder <code>wuerfel[4]</code> erfolgen. | Eine Änderung an dem Objekt <code>r1</code> kann hier mit <code>wuerfel[1]</code> oder <code>wuerfel[4]</code> erfolgen. Der Inhalt des Index <code>5</code> ist <code>null</code>, da noch keine Objektinstanz zugewiesen wurde. | ||
=== Umgang mit Nullreferenzen === | === Umgang mit Nullreferenzen === | ||
Im Gegensatz zu | Im Gegensatz zu Variablen werden die Inhalte eines Objektarrays mit dem Wert <code>null</code> initialisiert, auch, wenn noch keine Zuweisung stattgefunden hat. | ||
<syntaxhighlight lang="Java"> | |||
// Objektreferenzen | |||
Random zufall; | |||
zufall.nextInt(); // Fehler: variable zufall might not have been initialized | |||
Random zufall2 = null; | |||
zufall2.nextInt(); // java.lang.NullPointerException: Cannot invoke "java.util.Random.nextInt()" because "zufall2" is null | |||
Random zufall3 = new Random(); | |||
zufall3.nextInt(); // Funktioniert | |||
// Objektarrays | |||
Random[] wuerfel; | |||
wuerfel[0].nextInt(); // Fehler: variable wuerfel might not have been initialized | |||
Random[] wuerfel2 = new Random[2]; | |||
wuerfel2[0].nextInt(); // java.lang.NullPointerException: Cannot invoke "java.util.Random.nextInt()" because "wuerfel2[0]" is null | |||
Random[] wuerfel3 = new Random[2]; | |||
wuerfel3[0] = new Random(); | |||
wuerfel3[0].nextInt(); // Funktioniert | |||
</syntaxhighlight> | |||
Das bedeutet, ein Objektarray enthält zu Beginn überall den Wert <code>null</code>. Wird ein Index nicht mit einer Objektreferenz initialisiert, dann bleibt dort immer der Wert <code>null</code> gespeichert. (Im Beispiel oben der Index <code>5</code>.) | |||
Wenn du nun mit einer Zählschleife über ein Objektarray iterierst, dann musst du vor dem Zugriff auf das Objekt prüfen, ob überhaupt ein Objekt vorhanden ist, oder nur <code>null</code>. | Wenn du nun mit einer Zählschleife über ein Objektarray iterierst, dann musst du vor dem Zugriff auf das Objekt prüfen, ob überhaupt ein Objekt vorhanden ist, oder nur <code>null</code>. |
Version vom 5. Oktober 2021, 17:49 Uhr
Objektarrays
Arrays können nicht nur primitive Datentypen speichern, sondern auch komplexe Typen - also Objekte. Jedes Element ist dann eine Referenz auf eine Objektinstanz der deklarierten Klasse. Dabei können einzelne Indizes des Arrays auch auf dasselbe Objekt referenzieren. Ein Array ist aber auf Objekte einer Klasse beschränkt, die bei der Deklaration angegeben werden muss.
Random[] wuerfel = new Random[6];
wuerfel[4] = new Random();
wuerfel[0] = new Random();
wuerfel[2] = new Random();
wuerfel[1] = wuerfel[4];
wuerfel[3] = wuerfel[2];
Der gezeigte Quelltext würde beispielsweise folgendes Array erzeugen:
Eine Änderung an dem Objekt r1
kann hier mit wuerfel[1]
oder wuerfel[4]
erfolgen. Der Inhalt des Index 5
ist null
, da noch keine Objektinstanz zugewiesen wurde.
Umgang mit Nullreferenzen
Im Gegensatz zu Variablen werden die Inhalte eines Objektarrays mit dem Wert null
initialisiert, auch, wenn noch keine Zuweisung stattgefunden hat.
// Objektreferenzen
Random zufall;
zufall.nextInt(); // Fehler: variable zufall might not have been initialized
Random zufall2 = null;
zufall2.nextInt(); // java.lang.NullPointerException: Cannot invoke "java.util.Random.nextInt()" because "zufall2" is null
Random zufall3 = new Random();
zufall3.nextInt(); // Funktioniert
// Objektarrays
Random[] wuerfel;
wuerfel[0].nextInt(); // Fehler: variable wuerfel might not have been initialized
Random[] wuerfel2 = new Random[2];
wuerfel2[0].nextInt(); // java.lang.NullPointerException: Cannot invoke "java.util.Random.nextInt()" because "wuerfel2[0]" is null
Random[] wuerfel3 = new Random[2];
wuerfel3[0] = new Random();
wuerfel3[0].nextInt(); // Funktioniert
Das bedeutet, ein Objektarray enthält zu Beginn überall den Wert null
. Wird ein Index nicht mit einer Objektreferenz initialisiert, dann bleibt dort immer der Wert null
gespeichert. (Im Beispiel oben der Index 5
.)
Wenn du nun mit einer Zählschleife über ein Objektarray iterierst, dann musst du vor dem Zugriff auf das Objekt prüfen, ob überhaupt ein Objekt vorhanden ist, oder nur null
.
for(int i = 0; i < wuerfel.length; i++) {
Wuerfel w = wuerfel[i];
if( w != null ) {
w.werfen();
}
}