IllegalMonitorStateException

  • hallo

    ich hab hier folgendes problem:
    wir sollen snake nachprogrammiern mit ein paar features.
    bei einem klick soll der wurm sich in bewegung setzen bei einem weiteren wieder stehen bleiben
    bei einem 3. klick wieder anfahren

    start und stehenbleiben funktionieren ganz gut nur beim wiederanfahren kommt oben beschriebene exception hier die funktion die das regeln sollte:

    hoffe mir kann jemand helfen hab schon so viel herumprobiert aber komm nicht hinter die lösung :confused:

    lg klaus

  • Die JVM-Spec sagt folgendes:

    Zitat

    The notify method should be invoked for an object only when the current thread has already locked the object's lock, or an IllegalMonitorStateException will be thrown.

    Ohne mich tiefer damit beschäftigt zu haben, klingt das für mich so, als müsstest du "synchronized(nq)" an passender Stelle verwenden.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • nein da bleibt er dann beim 2. klick nicht mal mehr stehn gibt nur "null" aus wirft eine nullpointerexception

    ich seh mich da nicht mehr raus bei den meistn in der klasse funktionierts aber bei mir nicht egal was ich mache...

  • Ich verstehe nicht ganz was du versuchst...

    'snake' ist anscheinend ein Thread Objekt.
    Wenn du das 'Start' Menü auswählst und der 'snake' Thread noch
    nicht gestartet ist, startest du ihn, und änderst das Menü zu 'Stop'.

    Soweit so gut. Beim nächsten Aufruf der Methode geht du in den
    else Zweig und wartest mit snake.wait();
    (Worauf auch immer)

    Auf jeden Fall brauchst du

    Code
    snake.notify();

    um den wartenden Thread wieder aufzuwecken.

    Gibt es noch ein anderes Codestück, das mnu_changeSnakeState.setText() aufruft?

    Gibt es noch ein anderes Codestück, das mit den 'snake' Thread Objekt zu tun hat?

    Der Code ist mir unverständlich aber ich gebe zu bedenken:
    - wait(), notify(), notifyAll() kann nur aufgerufen werden, wenn der Lock auf das selbe Objekt durch synchronized gehalten wird.
    - start() kann nur EINMAL auf einen Thread aufgerufen werden.
    - Thread.State.NEW hat der Thread nur nach dem Erzeugen und vor dem Starten.

    lg

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • ich wart auf einen weiteren klick ins panel oder auf den menü text der wieder "start" sein sollte dann soll es ja wieder anfahren

    ich hatte auch schon snake.notify(); versucht aber auch ohne erfolg

    start soll eh nur einmal aufgerufen werden

    musste den code etwas umbauen da laut angabe bei einem 2. linksklick das spiel zu ende sein soll und bei rechtsklick nur pausiert bei einem weiteren wieder weiterläuft

  • sorry. vielleicht kannst du mir ein etwas größeres Stück Code schicken.
    Die Klassen als Anhang wären ein Anfang, ich würd's mir dann am WE anschaun.

    Aus der einen geposteten Methode werde ich nicht schlau.
    Ich kenne nicht die Abläufe in deinem Programm und weiß daher nicht
    was du mit dem Mutex 'snake' eigentlich schützen willst.

    vor allem ist jetzt auch noch (ein Thread?) 'nq' dazugekommen.

    lg

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • hab im anhang alle klassen von meinem projekt

    bringt mich bitte nicht um wegn der vielen statischen sachen
    hab irgndwie ein problem mit get/set
    und der mieserablen kommentare...

    weis nicht ob das wichtig ist aber die klassen wurden mit netbeans 6.7.1 erstellt

  • :poke:
    Ich kann mit den .class Files (natürlich) nicht viel anfangen, da diese
    nicht den Source Code enthalten sondern das Kompilat sind.

    Soll heißen ich brauch die .java Dateien, weil ich keine Lust hab die .class Files zu decompilieren...

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • sry für die class files hatte einen aussetzer^^

    hab jetzt aber ein weiteres problem nachdem ich das ganze auf set/get umgestellt hab lässt sich das programm nicht mehr starten... bekomm dann nach einer zeit einen "outofmemoryerror" =(

    set/get hat was gegen mich =(

  • Ich habe mir den Code angesehen.
    Plus: Er ist kompilierbar.

    Zum OutOfMemoryError:
    Der tritt auf, weil du rekursiv Konstruktoren von Klassen aufrufst, bis der Speicher futsch ist. Liegt wohl daran, dass Swing Komponenten recht speicherhungrig sind.
    Normalerweise kommt eine Stack Overflow Exception.

    Du hast folgendes geschrieben:

    Code
    class Snake {
      private SnakeFrame sf = new SnakeFrame();
    }
    
    
    class SnakeFrame {
      private Snake snake = new Snake();
    }

    Was passiert wenn man 'new SnakeFrame()' oder 'new Snake()' macht?

    Code
    new Snake();
      --> new SnakeFrame();
              --> new Snake();
                      --> new SnakeFrame();
    usw.

    Zu deinem Programm:

    Es scheint mir, als ob du Probleme mit den Grundsätzen von Java hast. Mir ist jetzt auch klar, warum du "Schwierigkeiten" mit Gettern/Settern hast.

    Als Grundsatzeinführung:
    Es gibt Klassen und es gibt Objekte (Instanzen) von Klassen.
    Es gibt statische Methoden, Variablen, etc. und auch non-static.

    Statisch bedeutet, dass du im Kontext der Klasse arbeitest. Nicht-Statisch ist im Kontext EINES Objektes.

    Daher, was man nicht erwarten kann:

    Ausgangssituation: 2 Objekte der Klasse Snake in 2 unterschiedlichen Klassen A, B

    Wenn in Klasse A: snakeObjekt1.setBuxtehude(true); aufgerufen wird.
    Gilt NICHT in Klasse B: snakeObjekt2.getBuxtehude() == true !!
    Falls nicht mit statischen 'Dingen' gearbeitet wird.

    Ich kann dir nur empfehlen ein Java Buch zu lesen. Z.B. "Java ist auch eine Insel".

    Siehe:
    http://openbook.galileocomputing.de/javainsel8/

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • ich hab das buch sogar nur komm ich nicht zum lesen =(

    da drengt sich imma irgndwas anderes rein stört mich eh total

    ich mag eigntlich keine setter & getter ^^ hast du richtig gedeutet ich bin eigntlich so in java reingestoßen worden die grundlagen hat die klasse ein jahr früher gemacht ich drehte eine ehrenrunde und dann wurde java nur fortgesetzt =(

    hab den fehler jetzt raus aber meine snake startet nicht mehr =( liegt wsl an dem pause

    mensch danke dir =) eigntlich eh ein blöder fehler :rolleyes:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!