Fehlersuche - brauche eure Hilfe

Status
Nicht offen für weitere Antworten.

rumkugeln

Mitglied
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.

Java:
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;
    }
}
 
S

SlaterB

Gast
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

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

The_S

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

Code:
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

Mitglied
Also ein Fehler ist mir jetzt aufgefallen:
Es muss anstatt
Java:
Thread thread = new Thread ();
heißen
Java:
Thread thread = new Thread (this);

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

CNail187

Mitglied
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:

Java:
Metronom a = new Metronom ();

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

Java:
//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
 
S

SlaterB

Gast
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

Mitglied
Ja, auch das noch...
:)

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

rumkugeln

Mitglied
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:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben