NPE-Fehler

  • Themenstarter Themenstarter blaues_etwas
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
B

blaues_etwas

Gast
Ich habe einen seltsamen Fehler und ich komm mit diesem nicht zurecht. Es handelt sich um diese Programmzeile:

Code:
label[3].setIcon(meinIcon.icon);

Dabei kommt die Fehlermeldung einer NullPointerException. Das heißt doch normalerweise, dass ich auf ein nicht existierendes Element des Feldes zugreifen möchte. Raus gefunden habe ich aber, dass der Aufruf "meinIcon.icon" den Fehler verursacht.
Wie behebe ich den Fehler ?

mfg blaues_etwas
 
Wann ist ein Objekt null ?
icon wurde ein ImageIcon zugewiesen, falls du das meinst.
 
Wann ist ein Objekt null ?
Gar nicht, null ist kein Objekt.

In Java Arbeitet man mit Referenzen auf Objekte, nicht mit Objekten selbst.
Referenzen können auf null zeigen, sobald man versucht null zu dereferenzieren (zb. meinIcon.icon), gibt eine NPE.

Nebenbei, warum keine getter methode für Icon???

Nachtrag: label[3] könnte auch null sein.
 
Das mit dem null verwirrt mich grad. Gibt es Quellen, wo das genauer erklärt wird ?
Habs auch schon mit einer Get-Methode gemacht, ändert aber nichts daran.
 
Eine Variable durchläuft drei Phasen:

1.Variable wird deklariert: z.B. JLabel meinLabel;

Dadurch hat die Variable einen Namen, aber ihr Wert ist null, denn es wurde noch kein Objekt zugeordnet. D.h. die Referenz zeigt auf quasi nichts. Hier kannst du Methoden zwar auf dem Objekt im Code anwenden, allerdings wird zur Laufzeit ein NPE geschmißen.

2.Variable wird initialisiert: mein Label = new JLabel();

Ab hier zeigt die Referenz auf ein neues Objekt. Es zeigt nicht mehr auf null.

3. Variable wird vernichtet -> Speicher freigeben.

Javaentwickler juckt das erstmal nicht, da dies der Garbage Collector macht.

In deinem Fall gibt es die bereits erwähnten Möglicheiten: das JLabel ist null oder meinIcon ist null.

Tipp: In solche Fällen hilft oft der Debugger. Es lohnt sich damit mal zu beschäftigen.
 
Hab immer noch das selbe Problem und ich verzweifel langsam..
Ich hab sogar ein neues Projekt angefangen und dieses mit dem essentiellen Code gefüllt, aber wieder die NPE. Wahrscheinlich ist es was total simples und ich bin zugleich blind wie ein Maulwurf.
Hab mich mal mit dem Debugger beschäftigt, aber ihn nicht zum laufen gebracht .. :|
Wenn ihr mir noch helfen wollt, kann ich mal etwas Code veröffentlichen.
 
blaues_etwas hat gesagt.:
Hab immer noch das selbe Problem und ich verzweifel langsam..
Ich hab sogar ein neues Projekt angefangen und dieses mit dem essentiellen Code gefüllt, aber wieder die NPE. Wahrscheinlich ist es was total simples und ich bin zugleich blind wie ein Maulwurf.
Hab mich mal mit dem Debugger beschäftigt, aber ihn nicht zum laufen gebracht .. :|
Wenn ihr mir noch helfen wollt, kann ich mal etwas Code veröffentlichen.

Vermutung 1)
Du erstellst das Array mit Labels, aber keine Labels selbst
Code:
JLabel label = new JLabel[10];
...
label[3].setIcon(meinIcon.icon); // label[3] ist null
Vermutung 2)
Du greifst auf meinIcon zu, während es noch null ist

Vermutung 3)
Du greifst auf meinIcon.icon zu, während 'icon' noch null ist.

😉

Das mit dem Debugger ist nicht Rocket Sience. Einfach einen Breakpoint an Anfang der Methode setzen,
in der du den Fehler vermutest (siehe Zeilennummer in der Exception) und das Programm bis daghin
laufen lassen.
 
Hier jetzt nicht mit einem Label sondern mit einem JToggleButton. Ändert aber nichts an der Problematik. Hoffe durch den Folgenden Code müssen keine Vermutungen mehr gestellt werden, sondern konkrete Lösungsvorschläge.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Brett extends JPanel implements ActionListener
{
	JToggleButton button;
	Spieler spieler;
	public Brett(){	
		button = new JToggleButton("klick");
		add(button);
		button.addActionListener(this);
	}
	public void actionPerformed(ActionEvent e){
 		if( e.getSource() == button )
		{
			button.setIcon(spieler.getLogo());
		}
	}
}

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Spieler extends JPanel{
	ImageIcon logo = new ImageIcon("logo.gif");
	public Spieler(){	}
	public ImageIcon getLogo(){
		return logo;
	}
}

Beim drücken von dem Button soll dieser das Icon, das in Spieler abgelegt ist, annehmen. Wenn gedrückt wird, kommt die NPE. Zwei weitere Klassen für das Management sind hier jetzt nicht aufgeführt.
Danke an alle, dir mir Helfen !!
 
Dein Spieler wird nie initialisiert.
Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
class Brett extends JPanel implements ActionListener 
{ 
   JToggleButton button; 
   Spieler spieler; 
   public Brett(){    
      button = new JToggleButton("klick"); 
      add(button); 
      button.addActionListener(this); 
   } 
   public void actionPerformed(ActionEvent e){ 
      if( e.getSource() == button ) 
      { 
         button.setIcon(spieler.getLogo());  // spieler ist null, hier knallt's.
      } 
   } 
}
 
OMG :shock: .. ich wusste es doch, was ganz banales. Mir war aber nicht bewusst, dass ich im brett noch einmal Spieler initialisieren muss. Spieler hab ich zwar schon in einer anderen Klasse initialisiert, und deshalb war ich der Meinung, dass es einmal für das ganze Programm vollkommen ausreicht.
Ham wa was gelernt .. :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben