# NullPointerException bei Aufruf von Methode



## phil111 (8. Jan 2012)

Hallo,

ich muss für die Schule ein Spiel programmieren und habe mir das Fifteen Puzzle heraus gesucht.Zuerst hatte ich eine Klasse Feld, Klasse GUI mit der main und eine Klasse Oberfläche, nun wollte ich aber die Methoden aus der Oberfläche nochmal in eine extra Klasse verschieben ,da mir das
nicht so gefiel alles in einer Klasse. Nun bekomme ich aber immer eine NullPointerException und weiß einfach nicht an was das liegt. 

Hier mal der Java Code

Klasse Feld:

```
package oberflaeche;

import javax.swing.JButton;

public class Feld {

	private int nr;
	private boolean attrib = true;
	public JButton button = new JButton();
	
	public Feld (int nr) {
		this.nr = nr;
		buttonRefresh();
	}
	
	public void setPlacement (int i) {
		if (i < 4) {
			button.setBounds(i * 50, 0, 50, 50);
		} else if (i < 8) {
			button.setBounds((i - 4) * 50, 50, 50, 50);	
		} else if (i < 12) {
			button.setBounds((i - 8) * 50, 100, 50, 50);	
		} else {
			button.setBounds((i - 12) * 50, 150, 50, 50);	
		}
	}
	
	public boolean getAttrib () {
		return attrib;
	}
	
	public void changeAttrib () {
		attrib = !attrib;
		buttonRefresh();
	}
	
	public void buttonRefresh () {
		if (attrib) {
			button.setText(String.valueOf(nr));
		} else {
			button.setText(" ");
		}
	}
	
	public void setNr (int nr) {
		this.nr = nr;
		buttonRefresh();
	}
	
	public int getNr () {
		return nr;
	}
	
	public JButton getButton () {
		return button;
	}
}
```

Klasse Oberfläche:

```
package oberflaeche;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Oberflaeche  {

	public JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="25,19"
	public JPanel jContentPane = null;
	public Feld[] felder = new Feld[16];
	public boolean[] random = new boolean[16];
	public JButton startButton = null;
	public JButton loadGame = null;
	public JLabel jLabel = null;
	public int spielzuege = 0;
	public boolean load = true;
	public JButton saveButton = null;
	public JLabel lbGewinn = null;
	/**
	 * This method initializes jFrame	
	 * 	
	 * @return javax.swing.JFrame	
	 */
	public JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setSize(new Dimension(217, 424));
			jFrame.setVisible(true);
			jFrame.setTitle("Fifteen");
			jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jFrame.setContentPane(getJContentPane());
			jContentPane.updateUI();
		}
		return jFrame;
	}
	
	public void addActions () {
		felder[0].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(0)) {
					pFifteen.changeBox(0, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[1].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(1)) {
					pFifteen.changeBox(1, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[2].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(2)) {
					pFifteen.changeBox(2, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[3].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(3)) {
					pFifteen.changeBox(3, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[4].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(4)) {
					pFifteen.changeBox(4, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[5].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(5)) {
					pFifteen.changeBox(5, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[6].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(6)) {
					pFifteen.changeBox(6, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[7].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(7)) {
					pFifteen.changeBox(7, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[8].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(8)) {
					pFifteen.changeBox(8, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[9].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(9)) {
					pFifteen.changeBox(9, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[10].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(10)) {
					pFifteen.changeBox(10, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[11].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(11)) {
					pFifteen.changeBox(11, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[12].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(12)) {
					pFifteen.changeBox(12, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[13].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(13)) {
					pFifteen.changeBox(13, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[14].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(14)) {
					pFifteen.changeBox(14, pFifteen.giveEmptyBox());
				}
			}
		});
		felder[15].button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (pFifteen.checkEmptyBox(15)) {
					pFifteen.changeBox(15, pFifteen.giveEmptyBox());
				}
			}
		});
	}

	
	
	/**
	 * This method initializes jContentPane	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	
	public JPanel getJContentPane() {
		if (jContentPane == null) {
			lbGewinn = new JLabel();
			lbGewinn.setBounds(new Rectangle(19, 340, 163, 29));
			lbGewinn.setText("");
			jLabel = new JLabel();
			jLabel.setBounds(new Rectangle(19, 319, 163, 16));
			jLabel.setText("Anzahl der Spielzüge: 0");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getStartButton(), null);
			jContentPane.add(getLoadGame(), null);
			jContentPane.add(jLabel, null);
			jContentPane.add(getSaveButton(), null);
			jContentPane.add(lbGewinn, null);
			
			
		}
		return jContentPane;
	}
	
	/**
	 * This method initializes startButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	public JButton getStartButton() {
		if (startButton == null) {
			startButton = new JButton();
			startButton.setBounds(new Rectangle(15, 255, 166, 24));
			startButton.setText("New Game");
			startButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					load = false;
					pFifteen.initialiseButtons();
					loadGame.setVisible(false);
					startButton.setVisible(false);
					saveButton.setVisible(true);
				}
			});
		}
		return startButton;
	}
	
	
	/**
	 * This method initializes loadGame	
	 * 	
	 * @return javax.swing.JButton	
	 */
	public JButton getLoadGame() {
		if (loadGame == null) {
			loadGame = new JButton();
			loadGame.setBounds(new Rectangle(15, 285, 166, 24));
			loadGame.setText("Load Game");
			loadGame.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					load = true;
					pFifteen.initialiseButtons();
					startButton.setVisible(false);
					loadGame.setVisible(false);
					saveButton.setVisible(true);
				}
			});
		}
		return loadGame;
	}

	/**
	 * This method initializes saveButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	public JButton getSaveButton() {
		if (saveButton == null) {
			saveButton = new JButton();
			saveButton.setBounds(new Rectangle(15, 255, 166, 24));
			saveButton.setText("Speichern..");
			saveButton.setVisible(false);
			saveButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					pFifteen.save();
				}
			});
		}
		return saveButton;
	}

	
	/*
 * (non-javadoc)
 */
private Fifteen pFifteen; 
}
```

Klasse Fifteen:


```
package oberflaeche;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Fifteen {
	private Fifteen pFifteen=this;
	
	public boolean checkEmptyBox (int i) {
		boolean possible = false;
		if (i == 0) {
			if (!(pOberflaeche.felder[i + 1].getAttrib()) || !(pOberflaeche.felder[i + 4].getAttrib())) {
				possible = true;
			}
		} else if (i == 1 || i == 2) {
			
			if (!(pOberflaeche.felder[i - 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 4].getAttrib())) {
				possible = true;
			}
		} else if (i == 3) {
			if (!(pOberflaeche.felder[i - 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 4].getAttrib())) {
				possible = true;
			}
		} else if (i == 4 || i == 8) {
			if (!(pOberflaeche.felder[i - 4].getAttrib()) || 
					!(pOberflaeche.felder[i + 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 4].getAttrib())) {
				possible = true;
			}
		} else if (i == 5 || i == 6 || i == 9 || i == 10) {
			if (!(pOberflaeche.felder[i - 4].getAttrib()) || 
					!(pOberflaeche.felder[i - 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 4].getAttrib())) {
				possible = true;
			}
		} else if (i == 7 || i == 11) {
			if (!(pOberflaeche.felder[i - 4].getAttrib()) || 
					!(pOberflaeche.felder[i - 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 4].getAttrib())) {
				possible = true;
			}
		}else if (i == 12) {
			if (!(pOberflaeche.felder[i - 4].getAttrib()) || !(pOberflaeche.felder[i + 1].getAttrib())) {
				possible = true;
			}
		} else if (i == 13 || i == 14) {
			if (!(pOberflaeche.felder[i - 1].getAttrib()) || 
					!(pOberflaeche.felder[i + 1].getAttrib()) || 
					!(pOberflaeche.felder[i - 4].getAttrib())) {
				possible = true;
			}
		} else if (i == 15) {
			if (!(pOberflaeche.felder[i - 1].getAttrib()) || 
					!(pOberflaeche.felder[i - 4].getAttrib())) {
				possible = true;
			}
		}
		return possible;
	}
	
	public int giveEmptyBox () {
		int field = 0;
		for (int i = 0; i < 16; i++) {
			if (!(pOberflaeche.felder[i].getAttrib())) {
				field = i;
			}
		}
		return field;
	}
	
	public void changeBox (int i, int y) {
		int temp = pOberflaeche.felder[y].getNr();
		boolean check = true;
		pOberflaeche.spielzuege ++;
		pOberflaeche.jLabel.setText("Anzahl der Spielzüge: " + pOberflaeche.spielzuege);
		pOberflaeche.felder[i].changeAttrib();
		pOberflaeche.felder[y].changeAttrib();
		pOberflaeche.felder[y].setNr(pOberflaeche.felder[i].getNr());
		pOberflaeche.felder[i].setNr(temp);
		for (int x = 0; x < 15; x++) {
			if (x == pOberflaeche.felder[x].getNr() - 1){
				check = true;
			} else {
				check = false;
				break;
			}
		}
		if (check) {
			pOberflaeche.lbGewinn.setText("Du hast Gewonnen");
	//		System.out.println("Sie haben gewonnen");
		}
		
	}
	public void initialiseButtons () {
		if (!pOberflaeche.load) {
			boolean besetzt = true;
			for (int i = 0; i < 16; i++) {
				pOberflaeche.random[i] = false;
			}
			int count = 16;
			int temp = 0;
			for (int i = 0; i < 16; i++) {
				while (besetzt) {
					temp = (int) ((Math.random() * 1000) % count);
					if (!pOberflaeche.random[temp]) {
						besetzt = !besetzt;
						pOberflaeche.felder[i] = new Feld(temp + 1);		
						pOberflaeche.random[temp] = true;
					}
				}
				besetzt = !besetzt;
				pOberflaeche.felder[i].setPlacement(i);
			}
		} else {
			try {
				BufferedReader in = new BufferedReader(new FileReader("spielstand.txt"));
				String zeile = null;
				for (int i = 0; i < 16; i++) {
					zeile = in.readLine();
					pOberflaeche.felder[i] = new Feld(Integer.parseInt(zeile));
					pOberflaeche.felder[i].setPlacement(i);
				}
				pOberflaeche.spielzuege = Integer.parseInt(in.readLine());
				pOberflaeche.jLabel.setText("Anzahl der Spielzüge: " + pOberflaeche.spielzuege);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		for (int i = 0; i < 16; i++) {
			if (pOberflaeche.felder[i].getNr() == 16) {
				pOberflaeche.felder[i].changeAttrib();
			}
		}
		pOberflaeche.addActions();
		for (Feld f : pOberflaeche.felder) {
			pOberflaeche.jContentPane.add(f.getButton());
		}
		pOberflaeche.jContentPane.updateUI();
	}

	public void save () {
		try
		{
			File file = new File("spielstand.txt");
			FileWriter fw = new FileWriter(file);
			
			for (Feld e : pOberflaeche.felder) {
				fw.write(e.getNr() + "\n");
			}
			fw.write(pOberflaeche.spielzuege + "\n");
			
			fw.flush();
			fw.close();
		}
		catch( IOException e )
		{
			e.printStackTrace();
		}
	}
	/*
 * (non-javadoc)
 */
private Oberflaeche pOberflaeche;

}
```

Klasse GUI:

```
package oberflaeche;

import javax.swing.JFrame;

public class GUI {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Oberflaeche oberflaeche = new Oberflaeche();
		JFrame frame = oberflaeche.getJFrame();
	}

}
```
Und die Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at oberflaeche.Oberflaeche$17.actionPerformed(Oberflaeche.java:209)
	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.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(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)

Ich hoffe Ihr könnt mir irgendwie helfen, bin noch nicht der Beste im Programmieren 

Grüße


----------



## qowaz (8. Jan 2012)

Deine Variable pFifteen wird nirgends initialisiert.


----------



## phil111 (8. Jan 2012)

Meinst du dies hier :
[JAVA=267]private Fifteen pFifteen;[/code] 
das ist ja der pointer zur Klasse Fifteen damit die Oberfläche auf die Klasse Fifteen zugreifen kann oder?


----------



## Schandro (8. Jan 2012)

> das ist ja der pointer zur Klasse Fifteen damit die Oberfläche auf die Klasse Fifteen zugreifen kann oder?


 Nö, das ist ein Pointer zu einem OBJECT der Klasse Fifteen, und du musst es irgendwo zuweisen bevor du es benutzen kannst.


----------



## phil111 (8. Jan 2012)

Wie sollte ich das dann schreiben ? Irgendwie weiß ich im moment nicht so recht weiter???:L


----------



## phil111 (9. Jan 2012)

Ich habe dass jetzt gelassen mit der Klasse Fifteen und alles in der Oberfläche gelassen. Ich möchte jetzt noch anstatt der Zahlen , Bilder auf den Buttons haben, bloß wo muss ich dass einfügen mit ImageIcon und setIcon? Wäre echt nett wenn mir da jemand weiterhelfen könnte  .


----------



## hdi (9. Jan 2012)

> mit ImageIcon und setIcon?


Genau. Um das ImageIcon zu erstellen gibt's mehrere Möglichkeiten, zB über ImageIO:
Reading/Loading an Image (The Java™ Tutorials > 2D Graphics > Working with Images)


----------



## phil111 (9. Jan 2012)

Hey

schonmal Danke .. So im Grunde wie ich ein Bild auf ein Button bekommen weiß ich .. bloß habe ich keine ahnung wie ich des jetzt in den quelltext einfüge damit er statt die nr die bilder auf die Buttons macht und dann auch vermischt ???:L


----------



## pl4gu33 (10. Jan 2012)

wenn das Bild z.b. im ProjektOrdner ist ... so zum Beispiel 


```
ImageIcon icon=new ImageIcon("b1.jpg");				
JButton btn=new JButton(icon);
```


----------



## HimBromBeere (11. Jan 2012)

> ```
> private Fifteen pFifteen=this;
> ```



Du kannst den this-Zeiger nicht außerhalb von Methoden verwenden (siehe: http://www.java-forum.org/java-basics-anfaenger-themen/130066-konstruktor-konstruktor.html)


----------



## hdi (11. Jan 2012)

> Du kannst den this-Zeiger nicht außerhalb von Methoden verwenden



@HimBromBeere: Wie ich schon in dem von dir verlinkten Thread geschrieben hab: Das ist Unsinn! Natürlich kann man das machen!


----------

