Hallo ihr Lieben ,
ich lerne neuerdings Java und habe folgendes Problem:
Ich deklariere in einer Klasse als Attribut eine ArrayList, erstelle die ArrayList im Konstruktor und hänge mit add ein Element ran. Danach wird die ArrayList nicht mehr verändert. In einer Methode, die später aufgerufen wird, steht eine For-Schleife mit
for (Typ laufvariable : liste) {, und in dieser Zeile bekomm ich eine NullPointerException, obwohl die Liste doch eigentlich nicht leer ist. Wieso passiert das und wie kann ich das reparieren?
Ich benutze die Lernumgebung Greenfoot, falls das eine Rolle spielen sollte. Den genauen Code habe ich momentan nicht dabei.
Danke und Grüße
Java: Schleife über ArrayList -> NullPointerException
@BlackJack: Es kann ja eigentlich nur zwei Möglichkeiten geben: Entweder `liste` selbst ist ``null``, oder `Typ` ist primitiv und in der Liste ist ein ``null`` als Wert was dann nicht ”ausgepackt” werden kann. Das ist der vielleicht nicht auf den ersten Blick offensichtliche Fall.
[codebox=java file=Unbenannt.java]import java.util.ArrayList;
import java.util.Collection;
public class Main {
private final Collection<Integer> liste;
public Main() {
liste = new ArrayList<>();
liste.add(23);
liste.add(42);
// liste.add(null);
}
private void someMethod() {
for (int zahl : liste) {
System.out.println(zahl);
}
}
public static void main(String[] args) {
Main main = new Main();
main.someMethod();
}
}[/code]
[codebox=java file=Unbenannt.java]import java.util.ArrayList;
import java.util.Collection;
public class Main {
private final Collection<Integer> liste;
public Main() {
liste = new ArrayList<>();
liste.add(23);
liste.add(42);
// liste.add(null);
}
private void someMethod() {
for (int zahl : liste) {
System.out.println(zahl);
}
}
public static void main(String[] args) {
Main main = new Main();
main.someMethod();
}
}[/code]
Der Fehler war, dass ich im Konstruktor stehen hatte ArrayList liste = new ArrayList();, und wegen der Typangabe vor dem Variablennamen wurde dem Attribut liste kein Wert zugewiesen, sondern eine lokale Variable erstellt, die außerhalb des Konstruktors nicht mehr existierte. In der anderen Methode wurde dann bei der For-Each-Schleife auf die auf Klassenebene deklarierte liste zugegriffen, die aber nie einen Wert bekommen hatte und immer noch null war. Da muss man ganz doll aufpassen, dass man nicht den Datentypen davor schreibt, wenn man ein Attribut mit einem Wert belegen will!
PS: Die angebotene Summe ist beachtlich.