# NullPointerException - Fehler beheben, nur, wo liegt er?



## Marco7757 (3. Feb 2010)

Hallo Freunde. Ich versuche meinen JPanels, die in einem Array gespeichert sind, eine neue Hintergrundefarbe zuzuweisen. Doch so recht will das nicht funktionieren.
Ich bekomme die Meldung

```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
```
bei folgendem Code:

```
if(panels_set==true) {
			for(int i=0;i<50;i++) {
				card[i].setBackground(Color.yellow);
			}
		}
```

card ist ein Array des Typs JPanel mit 50 Panels.

Was bedeutet denn nun die Fehlermeldung genau und wie kann ich den Fehler beheben?


----------



## punkt21 (3. Feb 2010)

gib mal card.length aus, oder mach ne abfrage mit card == null, prüfen ob das initialisiert wurde


----------



## nrg (3. Feb 2010)

sind die 50 Panels auch instanziiert?


----------



## Marco7757 (3. Feb 2010)

```
System.out.println(card.length);
```
 ergibt genau 50!

Der Code mit der null-Abfrage wird NICHT ausgeführt, das heisst, card ist nicht leer!

```
if(card==null) { System.out.println("test"); }
```

Instanziierung:

```
cards[z] = new card();
				card[z] = cards[z].add_card(z, x, y, setted_numbers);
```

Die Methode add_card(); gibt ein JPanel zurück! z ist ein Zähler der von 0 auf 49 zählt.


----------



## nrg (3. Feb 2010)

ja klar ist card nicht leer, weil das dein array mit der länge 50 ist. aber ist card[0], card[1] .... gefüllt mit Objecten der Klasse JPanel?

edit: was gibt den if (card[0] == null) zurück?
bzw zeig doch einfach mal weng mehr Code . so können wir noch paar Stunden rätseln


----------



## SlaterB (3. Feb 2010)

> Die Methode add_card(); gibt ein JPanel zurück!

tja, aber vielleicht null?
du brauchst nicht deinen Code verteidigen, dass ein Fehler drin ist, ist so gewiss wie die Weite des Universums,
die Fehlermeldung kommt nicht aus Spass


----------



## punkt21 (3. Feb 2010)

```
JPanel[] cardz = new JPanel[50];
		for (int i = 0; i < cardz.length; i++) {
			cardz[i] = new JPanel();
		}
```

So erzeugst du dein Array von Panels, die auch alle initialisiert sind.
danach müsstes du deinen code verwenden können


----------



## Marco7757 (3. Feb 2010)

^^

Also, card[0] gibt auch kein 0 zurück.

Hier die Klasse card:

```
public class card {
	public int index;
	public int value;
	public int x;
	public int y;
	private int[] possible = new int[10];
	public int[] pos2 = new int[10];
	
	public void setValues() {
		possible[1] = 5;
		possible[2] = 6;
		possible[3] = 6;
		possible[4] = 6;
		possible[5] = 6;
		possible[6] = 6;
		possible[7] = 5;
		possible[8] = 5;
		possible[9] = 4;
	}

	public JPanel add_card(int i, int x, int y, int[] settedNumbers) {
		setValues();
		this.index = i;
		this.value = (int) (Math.random()*9+1);
		while(settedNumbers[value]>=possible[value]) {
			this.value = (int) (Math.random()*9+1);
		}
		settedNumbers[value]++;
		setArray(settedNumbers);
		this.x = x;
		this.y = y;
		
		return createJPanel(this.value);
	}
	
	public int[] getSettedNumbers() {
		return pos2;
	}
	
	public void setArray(int[] array) {
		for(int i=0;i<array.length;i++) {
			pos2[i] = array[i];
		}
	}
	
	private JPanel createJPanel(int i) {
		GridBagLayout gbl      = new GridBagLayout();
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.anchor             = GridBagConstraints.CENTER;

		final JPanel panel = new JPanel(gbl);
		panel.setSize(75, 75);
		panel.setBorder(BorderFactory.createLineBorder(Color.black));
		panel.setBackground(Color.yellow);
		JLabel label = new JLabel(""+i);
		gbl.setConstraints(label,gbc);
		panel.add(label);
		
		return panel;
	}

}
```

Es wird hier ein Panel mit einer Zahl in ihm erstellt. Wichtig sind eigentlich nur die beiden Methoden add_card() und createJPanel(). Der Rest ist nur eine Hilfe, damit die beiden Hauptmethoden nicht zu unübersichtlich werden. getSettedNumbers() dient nur dazu, der anderen Klasse mitzuteilen, welche Nummern schon in ein Panel gesetzt wurde ...


----------



## SlaterB (3. Feb 2010)

von welchem Typ ist card[]?

wie kannst du einmal sowohl card als auch JPanel darin speichern
(cards[z] = new card();    card[z] = cards[z].add_card)
-> spricht für Object[] (edit: ok, selbst mit Object[] würde der Aufruf nicht gehen,
nochmal edit: jetzt sehe ich auch die unterschiedlichen Namen der Arrays  )

als auch an anderer Stelle card_.setBackground aufrufen -> spricht für JPanel[]?

es liegt nahe, dass du zwei unterschiedliche Arrays hast, eines gefüllt, das andere leer

ansonsten erkennt man aus dieser Konfusion, wie unendlich wichtig ein komplett geposteter Code von der main-Methode bis zum letzten Detail ist,
lange Methoden wie createJPanel(int i)  kann man dabei tatsächlich temporär auf 
> return new JPanel();
oder so vereinfachen_


----------



## nrg (3. Feb 2010)

SlaterB hat gesagt.:


> von welchem Typ ist card[]?



card ist vom typ JPanel und card*s* vom Typ card. Ich versteh allerdings anhand von der class card net was du bis vorhast/machst. Post mal den kompletten Code aber es wäre schön, wenn du vorher Deklarationen lt den Richtlinien für Groß-und Kleinschreibung änderst. (Klassen Groß etc)

edit die 3te : card ist vom Typ JPanel, card*z* auch und card*s* vom Typ card...
Also die Deklarationen sind echt ein grauß...


----------



## SlaterB (3. Feb 2010)

um auch mal wieder was richtiges zu sagen:
immerhin kam cardz erst von punkt21 rein, da ist Marco7757 nicht schuld dran


----------



## nrg (3. Feb 2010)

achso stimmt . gut dann hat mein ursprünglicher Post doch gepasst.


----------



## Marco7757 (3. Feb 2010)

Hey Leute


Tut mir leid, dass meine Namen so verwirrend sind. Das kommt, wenn man einfach drauflosprogrammiert und sich zu anfang noch gar nicht im klaren ist, was es alles braucht ...
Ich werde in Zukunft die Namensgebungsvorgaben beachten.

Ich habe jetzt den Fehler gefunden. Es lag daran, dass ich ich 50 Panel aufrufen wollte, jedoch nur 49 existierten. Eine Schleife beim erstellen der Panels lief einmal zu wenig durch ... Das Ganze funktioniert jetzt. Vielen Dank für die Hilfe.

Ich dachte nur, wenn ich meinen ganzen Code hier reinposte, wird es noch unübersichtlicher als es eh schon ist. Aber ich werde das in Zukunft machen und den Code auf das wesentliche Kürzen!

Nocheinmal vielen Dank für die Hilfe!


----------



## nrg (3. Feb 2010)

für die Zukunft setzte einfach mal Ausgaben an die Stelle, wo es eine Exception wirft und gebe da auch Informationen zur Schleife aus.

```
if (card[i] == null) System.out.println("card[" + i + "] ist NULL!");
```

oder mit Assertions

```
assert (card[i] != null): "card[" + i + "] ist NULL!";
```
Dann aber mit java -ea Klasse ausführen.

Oder einfach "step-by-step" Debuggen in einer IDE wie Eclipse oder Netbeans.

grüße
nrg


----------

