Java NullPointerException

Xerxes18

Lieutenant
Registriert
Aug. 2008
Beiträge
700
Hallo,

habe hier ein kleines Problem:

Ich habe ein JFrame mit einer JList (characterList). Ich habe zusätzlich noch eine JMenuBar und wenn man auf neuen Charakter erstellen klickt, erscheint ein Dialogfenster (Methode Fenster() in der Klasse Charaktereinfugen).

Wenn ich nun einen neuen Charakter erstelle und auf den Einfügen Button klicke, soll er diesen in die JList einfügen.

Die Methode für das Einfügen habe ich wiederum in der Klasse CharakterModel. Leider bekomme ich eine NullPointerException und weiß nicht wieso.

Wenn ich das Textfeld in dem Dialogfenster Static setze sowie die JList in der Klasse Hauptfenster funktioniert es, jedoch unterteile ich das ganze in Klassen mit Methoden und Klassen wo nur die GUI gezeichnet wird.

Hier die Methode in der Klasse CharakterModel, den ich gerne im ActionListener in Charaktereinfugen aufrufen möchte:

Code:
public void Einfugen(){
		
		Charaktereinfugen ce=new Charaktereinfugen();
		Hauptfenster hf=new Hauptfenster();
		
		hf.modelChar.addElement(ce.textFeldName.getText()); //hier die erste Zeile im Fehler
		
		          

	}


Hier der ActionListener in Charaktereinfugen:

Code:
public void actionPerformed(ActionEvent e) {

		if (e.getSource()==buttonEinfugen){
			
			CharakterModel cM=new CharakterModel();
			cM.Einfugen();
			ce.dispose();

			
			


		}
}

Und hier die Fehlermeldung:

Code:
Exception occurred during event dispatching:
java.lang.NullPointerException
	at Model.CharakterModel.Einfugen(CharakterModel.java:24)
	at View.Charaktereinfugen.actionPerformed(Charaktereinfugen.java:125)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.Dialog$1.run(Unknown Source)
	at java.awt.Dialog$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.Dialog.show(Unknown Source)
	at java.awt.Component.show(Unknown Source)
	at java.awt.Component.setVisible(Unknown Source)
	at java.awt.Window.setVisible(Unknown Source)
	at java.awt.Dialog.setVisible(Unknown Source)
	at View.Charaktereinfugen.CharakterEinfugen(Charaktereinfugen.java:96)
	at View.Hauptfenster.actionPerformed(Hauptfenster.java:533)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Ist die Klasse Hauptfenster dein JFrame?
Wenn ja, du kannst doch nicht einfach eine neue Instanz davon erzeugen! Du musst doch den vorhandenen JFrame nutzen um in Objekten, die dort existieren "rumfuschen" zu können.

Dann kommt noch hinzu, das du auch eine neue Instanz von Charaktereinfugen erzeugst und dann vom TextFeld den Text haben willst. Wie soll denn das gehen, wenn du ce gerade erst erzeugt hast!?

Du solltest dir vielleicht noch einmal genauer anschauen, wie Java funktioniert und was das mit den ganzen Objekten und Instanzen auf sich hat.

(vielleicht verstehe ich deinen Code auch falsch....aber dann solltest du mal mehr Informationen rausrücken - zum Beispiel, was passiert in den Konstruktoren von Hauptfenster und Charaktereinfugen).

Dann solltest du dir vielleicht auch noch die Java Code Conventions ( http://www.oracle.com/technetwork/java/codeconv-138413.html ) anschauen.
 
Nein du hast das schon richtig verstanden und ja ich bin Anfänger :)

Und ja ich denke es liegt daran, dass ich eine neue Instanz mache und deswegen die Exception kommt. WIe kann ich das genau vermeiden? Muss ich dann Static benutzen?
 
Überall wo du Referenzen auf andere Klassen benötigst, musst du diese (im Konstruktor) übergeben. Dann musst du nicht immer neue Instanzen erzeugen, sondern kannst mit
this.charaktereinfugen.einfuegen( String ); // Nur ein Beispiel
direkt auf die andere Klasse "zugreifen".

Ich befürchte allerdings, dein Design ist schon etwas wirr (oder ich kann mich gerade nicht so ganz in dein Problem hineindenken). Kannst du vielleicht die Klassen einmal posten?
 
Ich benutze keine Konstruktoren, z.B. die Klasse Hauptfenster beginnt folgendermaßen:

Code:
public class Hauptfenster implements ActionListener{
	
	
	public static JFrame fr;
	private JMenuBar hauptfensterBar;
	private JMenu datei;
               ....
               ....

public void hauptfenster() {
		
		fr=new JFrame();
		hauptfensterBar = new JMenuBar();
		datei = new JMenu();
                              ....
                              ...

}

sollte ich einfach einen Konstruktor daraus machen?
Ich würde die Klassen gerne hier reinposten, jedoch sind es viele und ich möchte nicht, dass diese jemand kopiert. bitte habt verständnis dafür, ich kann Sie dir allerdings per PN schicken, wenn du Zeit und Lust hast natürlich :)
 
So geht es ja auch. Aber du musst halt dafür sorgen, dass du alle notwendigen Informationen auch in den anderen Klassen hast und genau das ist ja dein Problem.

Mit static geht es, weil dann nur eine Instanz vom TextFeld gibt und selbst wenn du eine zweite Instanz der "übergeordneten" Klasse erzeugst, wird das (static) TextFeld von beiden genutzt (statische Variablen existieren immer nur einmal in einer VM).

Wenn du möchtest, kannst du mir die Klassen zuschicken. Muss aber mal schauen, ob ich mir die noch heute so genau anschauen kann.
 
Zurück
Oben