# getSource() findet Button nicht - ActionListener



## MarkusKirch (24. Mrz 2011)

Hallo!
Ich habe folgendes kleines Programm geschrieben!
Es ist nicht das erste mla, dass ich mit dem AL arbeite, doch diesesmal will er einfach nicht...
Obwohl alle Buttons feinsäuberlich deklariert und erzeugt wurde, gibt er folgende NullPointerException:


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at einarmigerBandit.zaehlen(einarmigerBandit.java:77)
	at einarmigerBandit.actionPerformed(einarmigerBandit.java:110)
	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.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Dies ist mein Programmcode:


```
// Import der Bibliotheken
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// Erstellen der Kklasse
public class einarmigerBandit implements ActionListener {
	// Deklarieren der einzelnen Objekte
	public JFrame f;
	public TextField zufallsZahl, laufendeZahl;
	public JLabel titel, ausgabe;
	public Font titelFont=new Font("Arial", 1, 17);
	public Font felderFont=new Font("Arial", 1, 26);
	public int laufendesInt, Differenz, Zufall1_100;
	public boolean stoppNichtGedrueckt;
	public JButton stopp, start, ende;
	
	// Konstruktormethode öffnen
	public void einarmigerBandit() {
		JFrame f=new JFrame("einarmiger Bandit");
		f.setSize(300, 350);
		f.setVisible(true);
		f.setLayout(null);
		stoppNichtGedrueckt=true;
		laufendesInt=1;
		
		JLabel titel=new JLabel("einarmiger Bandit");
		titel.setBounds(75, 50, 150, 50);
		titel.setFont(titelFont);
		f.add(titel);
		
		JLabel ausgabe=new JLabel("x");
		ausgabe.setBounds(0, 0, 150, 30);
		f.add(ausgabe);
		
		TextField eigeneZahl=new TextField();
		eigeneZahl.setBounds(75, 100, 50, 35);
		eigeneZahl.setEditable(false);
		eigeneZahl.setFont(felderFont);
		zufall();
		eigeneZahl.setText(String.valueOf(Zufall1_100));
		f.add(eigeneZahl);
		
		TextField zufallsZahl=new TextField();
		zufallsZahl.setBounds(175, 100, 50, 35);
		zufallsZahl.setText(String.valueOf(laufendesInt));
		zufallsZahl.setFont(felderFont);
		zufallsZahl.setEditable(false);
		f.add(zufallsZahl);
		
		stopp=new JButton();
		stopp.setText("Stopp");
		stopp.setBounds(75, 160, 150, 50);
		stopp.addActionListener(this);
		f.add(stopp);
		
		start=new JButton();
		start.setText("Start");
		start.setBounds(155, 250, 70, 30);
		start.addActionListener(this);
		f.add(start);
		
		ende=new JButton();
		ende.setText("Ende");
		ende.setBounds(75, 250,  70, 30);
		ende.addActionListener(this);
		f.add(ende);
		
		f.repaint();
	}
	
	public void zaehlen() {
		if(laufendesInt==99) {
			laufendesInt=1;
		}
		laufendesInt++;
		laufendeZahl.setText(String.valueOf(laufendesInt));
		System.out.println(laufendesInt);
		f.validate();
		f.repaint();
//		try{
//			Thread.sleep(100);
//		} catch(Exception e) {
//			System.out.println("Es konnte nicht gewartet werden!");
//		}		
	}
	
	public void pruefen() {
		Differenz=Math.abs(Integer.valueOf(zufallsZahl.getText())-Integer.valueOf(laufendeZahl.getText()));
		if(Differenz<=10) {
			ausgabe.setText("Nicht schlecht!");
		}
		if(Differenz<=5) {
			ausgabe.setText("Fast!");
		}
		if(Differenz==0) {
			ausgabe.setText("Gewonnen!");
		}
		f.repaint();
	}
	
	public void zufall() {		
		Zufall1_100=(int)(Math.random()*100)+1;
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==start) {
			stoppNichtGedrueckt=true;
			while(stoppNichtGedrueckt==true) {
				zaehlen();
			}
		}else if(e.getSource()==stopp) {
			stoppNichtGedrueckt=false;
			pruefen();			
		}else if(e.getSource()==ende) {
			System.exit(0);
		}
		System.out.println("actionPerformed Methode ausgeführt!");
	}


	
}
```

Kann jemand von euch vielleicht helfen?

Vielen Dank im Voraus!!!

VG Markus


----------



## Atze (24. Mrz 2011)

ich denke, dass das textfield "laufendeZahl" null ist, weil es dem stacktrace nach in zeile 77 die ursache ist und du es nirgendwo initialisierst


----------



## Haave (24. Mrz 2011)

Atze hat vermutlich Recht und abseits davon ein Hinweis:
[JAVA=18]// Konstruktormethode öffnen
    public void einarmigerBandit() {[/code]
Dies ist *kein* Konstruktor, da der Datentyp hier void ist. Ein Konstruktor sähe z.B. so aus (Klassennamen sollten großgeschrieben werden:

```
public einarmigerBandit() {}
```


----------



## MarkusKirch (24. Mrz 2011)

Ok Leute, vielen Dank für eure Hilfe!
Ich habe zwischendurch die Namen der einzelnen Objekte über Eclpises "Refactoring" Funktion umbenannt, dabei hat eclipse nicht alle Objektaufrufe korrekt umbenannt...

Zum Beispiel wird oben das TextField "eigenZahl"  deklariert, das eigenltich "zufallsZahl" heißen muss...
Und das TextField, dass als "zufallsZahl" deklariert wird, heißt eigentlich "laufendeZahl"...

Ich muss heute Mittag wirklich blind gewesen sein, das nicht zu merken...

Trotzdem vielen Dank euch!


VG Markus


----------



## Michael... (24. Mrz 2011)

MarkusKirch hat gesagt.:


> Ich habe zwischendurch die Namen der einzelnen Objekte über Eclpises "Refactoring" Funktion umbenannt, dabei hat eclipse nicht alle Objektaufrufe korrekt umbenannt...
> 
> Zum Beispiel wird oben das TextField "eigenZahl"  deklariert, das eigenltich "zufallsZahl" heißen muss...
> Und das TextField, dass als "zufallsZahl" deklariert wird, heißt eigentlich "laufendeZahl"...


Hierbei handelt es ich um unterschiedliche Variablen 
	
	
	
	





```
zufallsZahl
```
 und 
	
	
	
	





```
laufendeZahl
```
 sind Instanzvariable, während 
	
	
	
	





```
eigeneZahl
```
 und 
	
	
	
	





```
zufallsZahl
```
 lokale nur in der Methode 
	
	
	
	





```
einarmigerBandit()
```
 gültig sind.
Daher war die Umbenennung von Eclipse korrekt.

Ansonsten sollte man AWT und Swingkomponenten nicht mischen: TextField ==> JTextField


----------

