# Fehlersuche - brauche eure Hilfe



## rumkugeln (19. Jul 2009)

In folgendem Quelltext ist ein Fehler, der vom Compiler leider nicht gefunden wird und der sich nur durch das Abstürzen des Programmes nach dem Start zeigt. Wäre nett wenn ihr mir helfen könntet.


```
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;


public class Metronom extends MIDlet implements ItemStateListener, CommandListener
{
    Form fenstereins = new Form ("Metronom");
    Form fensterzwei = new Form ("Metronom");
    Display display = Display.getDisplay (this);

    Zeichnerklasse z = new Zeichnerklasse ();

    ChoiceGroup einheit = new ChoiceGroup ("Einheit", Choice.EXCLUSIVE, new String [] {"BpM", "Hz"}, null);
    TextField frequenz = new TextField ("Frequenz","", 5, TextField.NUMERIC);
    ChoiceGroup taktEinheit = new ChoiceGroup ("Takteinheit", Choice.EXCLUSIVE, new String [] { "Viertel", "Achtel","Sechzehntel"}, null);

    Command weiter = new Command ("Weiter", Command.SCREEN, 1);
    Command beenden = new Command ("Beenden", Command.EXIT, 2);
    Command start = new Command ("Start", Command.OK, 1);
    Command stop = new Command ("Stop", Command.SCREEN,2);

    int intFrequenz;
    int wartezeit;



    public Metronom ()
    {
       
    }

    public void startApp ()
    {
        display.setCurrent (fenstereins);
        fenstereins.setCommandListener (this);
        fenstereins.addCommand (weiter);
        fenstereins.addCommand (beenden);
        fenstereins.setItemStateListener (this);
        fenstereins.append (einheit);
        fenstereins.append (frequenz);
        fensterzwei.setCommandListener (this);
        fensterzwei.addCommand (start);
        fensterzwei.setItemStateListener (this);
        fensterzwei.append (taktEinheit);
        z.setCommandListener (this);
        z.addCommand (stop);

    }

    public void itemStateChanged (Item item)
    {
        if (item == einheit)
        {
            int index = einheit.getSelectedIndex ();
            if (index == 0)
            {
                intFrequenz = (Integer.parseInt (frequenz.getString ()))/60;
                wartezeit = (1/intFrequenz)*1000;
            }
            else if (index == 1)
                wartezeit = (1/intFrequenz)*1000;
        }
    }

    public void commandAction (Command c, Displayable d)
    {
        if (c == weiter)
            display.setCurrent (fensterzwei);
        else if ( c == beenden)
            notifyDestroyed ();
        else if (c == start)
        {
            display.setCurrent (z);
            z.start();
        }
        else if (c == stop)
        {
            display.setCurrent (fenstereins);
            z.stop();
        }
    }



    public void pauseApp ()
    {

    }

    public void destroyApp (boolean unkonditional)
    {

    }
}






class Zeichnerklasse extends Canvas implements Runnable
{

    int helfer = 0;
    int helfershelfer;
    boolean test=true;
    Metronom a = new Metronom ();

    public void paint (Graphics g)
    {
        g.setColor (215,255,191);
        g.fillRect (0,0, getWidth(), getHeight());
        if (helfer == 0)
        {
           g.setColor (48,75,255);
           g.fillRect (70,50,100,100);
           helfer++;
        }
        else if (helfer ==1)
        {
            g.setColor (255,122,50);
            g.fillRect (70,200,100,100);
            helfer--;
        }

        else
        {
            System.out.println ("Fuck");
        }



    }

    public void start ()
    {
        Thread thread = new Thread ();
        thread.start ();
        test = true;
    }

    public void run ()
    {
        while (test = true)
        {
             repaint ();
             try
             {
                  Thread.sleep ( a.wartezeit);
             }

             catch (InterruptedException o)
             {

             }
        }
    }

    public void stop ()
    {
        test = false;
    }
}
```


----------



## SlaterB (19. Jul 2009)

keine Exceptions zu sehen, keine Möglichkeit für eigenes Logging? na viel Spass bei kommenden Fehlern,

ich könnte mir vorstellen dass bei
> Display display = Display.getDisplay (this);

display null ist,
das könnte ähnlich schlimm wie getGraphics() in Swing-Applikationen sein, falls dir das was sagt,
solche Umgebungobjekte besser erst dann holen, wenn sie benötigt werden, hier z.B. in startApp()


------

> Thread thread = new Thread ();
>        thread.start ();

wird nicht viel machen, meinst du
 Thread thread = new Thread (this);
?


----------



## rumkugeln (19. Jul 2009)

Danke, das meinte mein Kumpel auch! Ich habe es geändert, aber nichts passiert.


----------



## The_S (20. Jul 2009)

Keine Fehlermeldung in deiner IDE vom Emulator?


----------



## rumkugeln (20. Jul 2009)

Von der IDE nicht, nur eine Fehlermeldung auf dem Display des emulierten Telefons mit sowas wie "Die Anwendung wurde unerwartet geschlossen"


----------



## The_S (20. Jul 2009)

Also ich bekomme, wenn ich deinen Code ausführe, folgenden Fehler


```
java.lang.SecurityException: MIDlet not constructed by createMIDlet.
 - com.sun.midp.midlet.MIDletStateHandler.newMIDletPeer(), bci=24
 - javax.microedition.midlet.MIDlet.<init>(), bci=9
 - Metronom.<init>(), bci=1
 - Zeichnerklasse.<init>(), bci=19
 - Metronom.<init>(), bci=43
 - java.lang.Class.newInstance(), bci=0
 - com.sun.midp.main.CldcMIDletLoader.newInstance(), bci=46
 - com.sun.midp.midlet.MIDletStateHandler.createMIDlet(), bci=66
 - com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet(), bci=17
 - com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=27
 - com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
 - com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
 - com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
 - com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26
```

Allerdings kann ich damit auf die Schnelle nichts anfangen und habe auch gerade keine Zeit, deinen Code genauer zu analysieren.


----------



## rumkugeln (20. Jul 2009)

Also ein Fehler ist mir jetzt aufgefallen:
Es muss anstatt

```
Thread thread = new Thread ();
```
heißen

```
Thread thread = new Thread (this);
```

Leider ist das immer noch nicht der ausschlaggebende Fehler und die Fehlermeldung erscheint weiterhin.


----------



## CNail187 (20. Jul 2009)

Hallo!

So ganz bin ich auch noch nicht durchgestiegen, ABER:
Die Exception wird geworfen wenn der Konstruktor von Zeichnerklasse aufgerufen wird und zwar in der Zeile:


```
Metronom a = new Metronom ();
```

Wozu auch immer die gut sein soll...
Wolltest du evtl. eine Referenz benutzen?
Also so was in der Art:


```
//Metronom
Zeichnerklasse z;

//starApp Metronom
z = new Zeichnerklasse(this);
z.setCommandListener(this);
z.addCommand(stop);

//Zeichnerklasse
//Metronom a = new Metronom();
Metronom a;

//Konstruktor Zeichnerklasse
public Zeichnerklasse(Metronom aMetronom) {
   this.a = aMetronom;
}
```

Damit startet das ganze immerhin schonmal im Emulator

Grüße,
CNail


----------



## SlaterB (20. Jul 2009)

eine schöne Endlosschleife:
Metronom erzeugt Zeichnerklasse-Objekt,
Zeichnerklasse erzeugt Metronom-Objekt,
Metronom erzeugt Zeichnerklasse-Objekt,
Zeichnerklasse erzeugt Metronom-Objekt,
Metronom erzeugt Zeichnerklasse-Objekt,
Zeichnerklasse erzeugt Metronom-Objekt..


----------



## CNail187 (20. Jul 2009)

Ja, auch das noch...


Also besser in den Konstruktor mit der Zeichnerklasse-Erzeugung.
Zusammen mit dem Thread(this)... "wackelt dann auch was" im Display...


----------



## rumkugeln (20. Jul 2009)

Genau das war es!!! Jetzt lässt sich das Programm immerhin schon wieder ausführen. Echt vielen Dank für die schnelle kompetente Hilfe!!!  :toll::toll:


----------

