# Problem mit MouseMotionListener / NullPointerException



## Deady1 (3. Apr 2007)

Hi,
ich bin Anfänger und komme bei meinem Spielversuch "Herr der Fliegen" nicht so recht weiter.
Bei dem Spiel soll es darum gehen, fliegen beim Pinkeln abzuschießen.
Wenn ich versuche, den POINT, den mir der MotionListener gibt, als Zielpunkt zu benutzen, kommt die Exception.
Außerdem funktioniert das Update meines labelPanels nicht so recht (Zeit, Fliegen, Punkte), obwohl die Berechnung hinhaut.

Habe jetzt schon zu lange rumprobiert und nach einer Lösung gesucht. Aber irgendwie habe ich mich wohl verrannt.

Kann mir jemand einen Tipp geben, was in beiden Fällen falsch gelaufen ist? 
Einige Sachen habe ich nur zum Testen eingebaut, wie z.B. die beiden Button in EAST und WEST.
Hier mal der Teil des Codes, der für das Hauptfenster zuständig ist.

Bin für jede Hilfe dankbar!
Deady1


```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Lordfly implements Runnable {
  JFrame frame;
  JPanel labelPanel = new JPanel();
  JPanel buttonPanel = new JPanel();

  JButton button1 = new JButton("Ich muss nochmal");
  JButton button2 = new JButton("Sound ausschalten");
  JButton button3 = new JButton("Ergebnis merken");
  JButton test = new JButton("Fliege");
  JButton daneben = new JButton("daneben");

  Point src;
  int startx = 150;
  int starty = 370;
  int zielx = 0;
  int ziely = 0;
  int dm = 5;

  int zeit = 30;
  int alter = 99;
  int punkte = 0;
  int fliegen = 0;
  int abzuege = 0;

  JLabel alterLabel = new JLabel("Alter: " + alter + " ");
  JLabel zeitLabel = new JLabel("Zeit: " + zeit + " ");
  JLabel punkteLabel = new JLabel("Punkte: " + punkte + " ");
  JLabel fliegenLabel = new JLabel("Fliegen: " + fliegen + " ");

  Font ft = new Font("Monospaced", Font.BOLD, 16);
  Thread timer;

  public Lordfly() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    buttonPanel.add(button1);
    buttonPanel.add(button2);
    buttonPanel.add(button3);

    zeitLabel.setFont(ft);
    alterLabel.setFont(ft);
    punkteLabel.setFont(ft);
    fliegenLabel.setFont(ft);

    labelPanel.add(alterLabel);
    labelPanel.add(zeitLabel);
    labelPanel.add(punkteLabel);
    labelPanel.add(fliegenLabel);

    FliegenPanel flp = new FliegenPanel();
    if (timer == null) {
      timer = new Thread(this);
      timer.start();
    }

    frame.add(BorderLayout.NORTH, labelPanel);
    frame.add(BorderLayout.CENTER, flp);
    frame.add(BorderLayout.SOUTH, buttonPanel);
    frame.add(BorderLayout.WEST, daneben);
    frame.add(BorderLayout.EAST, test);

    frame.setSize(450, 500);
    frame.setTitle("Lord of the Flies");
    frame.setVisible(true);

    button1.addActionListener(new NeustartListener());
    button2.addActionListener(new SoundListener());
    button3.addActionListener(new SpeichernListener());
    test.addActionListener(new TrefferTestListener()); //Simulation
    daneben.addActionListener(new DanebenTestListener()); //Simulation
    flp.addMouseMotionListener(new ZielpunktListener());
  }

  public static void main(String[] args) {
    Lordfly lf = new Lordfly();
//    lf.los();
  }

  public void run() {
    while (true) {
      for (int i = 30; i > 0; i--) {
        zeit--;
        frame.repaint();
        try {
          timer.sleep(1000);
        }
        catch (InterruptedException ex) {
          ex.printStackTrace();
        }
      }
    }
  }

  public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
  }

  public void los() {
    Fragen Spieloptionen = new Fragen();
    Spieloptionen.einstellen();
  }

  class ZielpunktListener      implements MouseMotionListener {
    public void mouseMoved(MouseEvent event) {}

    public void mouseDragged(MouseEvent event) {
      src = event.getPoint();
      System.out.println("Mousepointer: " + src);
    }
  }

  class TrefferTestListener      implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
      fliegen++;
      punkte = (fliegen * 3) - abzuege;
    }
  }

  class DanebenTestListener      implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
      abzuege++;
      punkte--;
    }
  }

  class NeustartListener      implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
      if (button1.getText() == "Kurze Pause") {
        button1.setText("Geht weiter");
        //Spiel stoppen
      }
      else if (button1.getText() == "Geht weiter") {
        button1.setText("Kurze Pause");
        //Spiel fortsetzen
      }
      else {
        button1.setText("Kurze Pause");
        zeit = 30;
        punkte = 0;
        fliegen = 0;
        frame.repaint();
        //Spiel neu starten
      }
    }
  }

  class SoundListener      implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
      if (button2.getText() == "Sound ausschalten")
        button2.setText("Sound einschalten");
      else
        button2.setText("Sound ausschalten");
      //Sound ändern
    }
  }

  class SpeichernListener      implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
      //Ergebnis abspeichern
    }
  }

  class FliegenPanel      extends JPanel implements Runnable {
    Thread runner;
    Image becken[] = new Image[3];
    int current = 1;
    int x = 0;
    int y = 0;

    public FliegenPanel() {
      super();
      setBackground(Color.black);
      String backs[] = {"U1_black.gif", "U2_white.gif", "U3_brown.gif"};
      Toolkit kit = Toolkit.getDefaultToolkit();
      for (int i = 0; i < becken.length; i++) {
        becken[i] = kit.getImage(backs[i]);
      }
      if (runner == null) {
        runner = new Thread(this);
        runner.start();
      }
    }

    public void paintComponent(Graphics g) {
      Graphics2D g2d = (Graphics2D) g;
      g2d.drawImage(becken[current], x, y, this);
      g2d.setColor(Color.yellow);
      g2d.fillOval(startx, starty, dm, dm);
    }

    public void run() {
      zielx = src.x;
      ziely = src.y;
      System.out.println("Test: " + src.y + " " + ziely);
/*      if (ziely > starty) {
        for (int i = starty; i < ziely; i++) {
          for (int j = startx; j > zielx; j--) {
            ziely++;
            zielx--;
          }
        }
      }
      else {
        for (int i = starty; i > ziely; i--) {
          for (int j = startx; j > zielx; j--) {
            ziely--;
            zielx--; 
          }
        } 
      }*/
      frame.repaint();
    }
  }
}
```


----------



## Wildcard (3. Apr 2007)

Die Exception und die verursachende Codezeile solltest du schon angeben.


----------



## Deady1 (4. Apr 2007)

Hallo,
ja klar, danke. Die offenbar fehlerhafte Zuordnung geschieht in Zeile 198 und 199. 

Hier der Text:
Exception in thread "Thread-2" java.lang.NullPointerException
at lordfly.Lordfly$FliegenPanel.run(Lordfly.java:198)
at java.lang.Thread.run(Unknown Source)

Deady1


----------



## SlaterB (4. Apr 2007)

finde das doch selber raus:
welches Objekt ist null? wenn du es nicht sofort erkennst, 
dann schreibe 
System.out.println("Object x ist: "+x)
für alle in Frage kommenden Objekte in die Zeile davor

wenn du das Objekt kennst, dann überlege wann und wo das Objekt gesetzt wird,
was ist dir unklar?


----------



## Deady1 (4. Apr 2007)

Hi SlaterB,
okay, ich habe gesehen, dass die Variable src "null" ist. Die Zuweisung von src erfolgt in Zeile 114. Und ich bekomme ja auch jede Menge Daten vom MouseMotionListener.
Der Ausdruck von Zeile 115 sieht wie folgt aus:

Mousepointer: java.awt.Point[x=211,y=207]
Mousepointer: java.awt.Point[x=208,y=208]
Mousepointer: java.awt.Point[x=205,y=208]
Mousepointer: java.awt.Point[x=202,y=208]

Die Variable src hat also offenbar doch einen Wert? Warum funktioniert die Zuweisung dann nicht richtig?


----------



## Wildcard (4. Apr 2007)

Du versuchst wohl auf src zuzugreifen bevor die Variable einen Wert hat.


----------



## SlaterB (4. Apr 2007)

mit Ausgaben a la
System.out.println("Object x ist: "+x); (in run)
und 
System.out.println("setzte Object x auf: "+x) 
(im MouseListener)
stellt sich so eine Frage gar nicht..


----------



## Deady1 (5. Apr 2007)

Also, verehrter SlaterB,
ich erkenne Deinen JAVA-Wissensvorsprung ausdrücklich an und nichts liegt mir ferner, als jemanden zu kritisieren, der mir Hilfe anbietet. Aber wenn Du schon Deine Hilfe anbietest, dann hilf bitte auch. Keine Ratespiele, kein Zynismus. BITTE!

Hier nochmal der Ausdruck explizit für dich:

System.out.println("src bei run: " + src);
src bei run: null

System.out.println("src im Listener: " + src);
src im Listener: java.awt.Point[x=122,y=220]

System.out.println("src im Listener: " + src.x + " " + src.y);
src im Listener: 122 220

Für mich sind das zwei widersprüchliche Informationen. Meine Frage war: WARUM? Warum hat src einen Wert, den ich aber nicht an eine andere Variable übergeben kann? Vielleicht kennst Du ja die Antwort auch nicht. Wäre kein Problem. NUR BITTE KEINE WEITEREN RATESPIELE!
Vielen Dank und schöne Ostern!
Deady1


----------



## Wildcard (5. Apr 2007)

Soweit ich das sehe weist du src erst einen Wert bei mouseDragged zu.
Wenn der Thread auf die Variable zugreift bevor es ein 'mouseDragged' gab fliegt die Sache auf die Nase.


----------



## SlaterB (6. Apr 2007)

habe ich jemanden kritisiert? 
und nur weil Posts in einer bestimmten Reihenfolge stehen, müssen sie sich doch nicht aufeinander beziehen,
ich sprach schon mit dir und nicht mit Wildcard,

und wenn ein Programm eine Sekunde nach Start auf eine Variable zugreift (Ausgabe 'Variable ist null')
und erst nach 10 Sekunden die Variable setzt (Ausgabe 'Variable gesetzt')
dann ist das kein Ratespiel, sondern ein klarer Fall

dachte ich zumindest, sorry für meine Vermutung,
ich wollte ja nur helfen..


----------



## Deady1 (7. Apr 2007)

jo, danke.
habe der Variablen src jetzt eine Startinitialisierung verpasst. Kaum macht man's richtig, schon funktioniert's. Deine (Eure) Vermutung war also absolut richtig, nur muss man mich (als JAVA-Anfänger) manchmal direkt mit der Nase darauf stoßen. 
Außerdem (ich will ehrlich sein): die langen Verzögerungen nerven manchmal, wenn man so voller Programmierwut ist - und dann nicht weiter kommt. SORRY. Mein Fehler!
Deady1


----------

