Arrays - Zugriffsfehler und NPE

JKK

Mitglied
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:

Java:
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\Arrayab
0kein ZugriffZugriff
1kein Zugriffkein Zugriff
2kein ZugriffZugriff
3Zugriffkein Zugriff
4kein 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.)
 
Zuletzt bearbeitet von einem Moderator:

mihe7

Top Contributor
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.
 
K

kneitzel

Gast
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.
 

Neue Themen


Oben