# Arrays - Zugriffsfehler und NPE



## JKK (10. Dez 2020)

Guten Abend,

diese Woche ging es in meinem Programmiermodul um Arrays. Dabei kamen mir gleich zwei Aufgaben unter, die bei mir Unverständnis ausgelöst haben.

*1.*
Es existieren die Arrays 
int a[] = {1,2,3,4,5};
int b[] = {2,3,5,7,-1};

aus diesen resultierend sollte hier die Ergebnisse der Ausdrücke berechnet werden:


```
a[1]
a[a[1]]
b[b[b[0]]]
a[a[a[0]]]
a[b[a[3] % 3]]
a[b[a[3]] % 3]
b[b[a[4] % b.length]]
a[b[b.length * 11 % 3]]
a[b[b[0] * b[0]]]
a[(a.length * b[a[b[0]]]) % a.length]
```


Das habe ich dann soweit verstanden.


"Bei der Auswertung der Ausdrücke ergaben sich insgesamt drei Zugriffsfehler. Geben Sie an, auf welches der Felder es im Verlauf der Auswertungen einen Lesezugriff gab, bevor es zum Zugriffsfehler kam (nur die Ausdrücke mit Zugriffsfehler)."

_Und hier verstehe ich nicht wirklich, was gemeint ist (das sind schon die Lösungen in den beiden Spalten. Hier sollte eigentlich Zugriff/kein Zugriff ausgewählt werden)_

*Index\Array**a**b**0*kein ZugriffZugriff*1*kein Zugriffkein Zugriff*2*kein ZugriffZugriff*3*Zugriffkein Zugriff*4*kein ZugriffZugriff


*2.* Kann ich nicht in vollem Umfang stellen, da es sich auf eine Aufgabe bezieht, die ich abgeben muss. Prüfungsbetrug und so... So sehr ich dieses Java-Modul mittlerweile nicht mehr ausstehen kann, so weit bin ich noch nicht, betrügen zu wollen.

Dennoch soviel: ist 

*CD[] cds;
*
eine gültige Initialisierung für ein Array cds[] (wobei CD eine Klasse ist), wenn am Ende des Programms eine Methode steht, die das Array mittels 

*cds[nextFreePos].setTitle(title);*

füllt, wobei setTitle eine Methode der Klasse CD ist?
Und was könnten sehr wahrscheinliche Ursachen sein, dass (in einer solchen Konstellation) dieses Array nicht gefüllt wird, d.h. das Programm aufgrund eines NPE abgebrochen wird? (die Gesamtaufgabe ist, 2 Fehlerstellen im Programmcode zu finden. Bisher konnte ich es schon auf dises Array eingrenzen. Allerdings verstehe ich nicht, wieso das Array angeblich keinen Inhalt haben soll.)


----------



## mihe7 (10. Dez 2020)

JKK hat gesagt.:


> Und hier verstehe ich nicht wirklich, was gemeint ist


Beispiel: der Ausdruck `b[b[b[0]]]` führt zu einem Zugriffsfehler. 

Die Auswertung erfolgt von "innen nach außen". Zuerst wird also `b[0]` ausgewertet und damit das Element an Index 0 des Arrays b gelesen (Zugriff). Dort ist eine 2 eingetragen. Wenn wir diese im Ausdruck substituieren, erhalten wir den äquivalenten Ausdruck `b[b[2]]`. 

Jetzt wird also `b[2]` ausgewertet und damit das Element an Index 2 des Arrays gelesen (Zugriff). Dort ist eine 5 eingetragen. Wenn wir diese im Ausdruck substituieren, erhalten wir den äquivalenten Ausdruck `b[5]`.

Nun wird versucht, `b[5]` auszuwerten, also das Element an Index 5 des Arrays zu lesen. Das muss fehlschlagen, denn der größte zur Verfügung stehende Index im Array ist 4.

Bis zum Fehler haben wir also zwei Zugriffe auf das Array b, nämlich auf Index 0 und auf Index 2.


----------



## kneitzel (10. Dez 2020)

Und zum zweiten Part:
CD[] cds;
ist nur eine Deklaration der Variable und enthält keine Initialisierung.

Daher ist ein lesender Zugriff auf die lokale Variable nicht möglich und der Compiler sollte does anmeckern. Bei einer Instanzvariablen findet eine automatische Initialisierung statt - da wird null zugewiesen, was dann bei einem Zugriff zu einer NullPointerException führt.


----------

