11 votes

IllegalMonitorStateException

Lorsque nous exécutons notre programme, nous obtenons une exception de type java.lang.IllegalMonitorStateException. Sur le site de l'API Java6, il est indiqué qu'il existe un constructeur qui donne des détails sur l'exception : IllegalMonitorStateException(String s)

Comment pouvons-nous utiliser cela pour avoir une meilleure idée de l'endroit où se trouve le bug dans notre code ? Y a-t-il autre chose que nous puissions faire (en plus des nombreux débogages que nous faisons actuellement) pour localiser la fonction ou la ligne qui a échoué ?

14voto

Carlos Heuberger Points 11804

Les détails doivent être donnés lors de la création de l'exception (constructeur, n'est-ce pas ?) et si vous ne la créez pas, il n'y a aucun moyen pour vous de fournir les détails.

Vous pouvez analyser le StackTrace de l'exception. Il montre les classes, méthodes et lignes de source qui ont été appelées pour causer l'exception.

L'une des causes de la IllegalMonitorStateException essaie d'attendre sur un objet sans s'être synchronisé sur lui. Voir le Javadoc .

Il existe d'autres causes possibles et l'exception peut être déclenchée par une bibliothèque ou un code externe. Je pense que seul le StackTrace peut aider...

9voto

kmcguire Points 116

Cela peut se produire parce que l'instance de l'objet sur lequel vous appelez wait ou notify est différente de l'instance avec laquelle vous vous êtes synchronisé. Par exemple :

Integer      a;

a = new Integer(0);    

synchronized(a) {
    System.out.printf("I synchronized on %h.", a);
    ++a;
    System.out.printf("But, I am calling notify for %h and I hold no lock for it.", a);
    a.notify();
}

Cela lancera la IllegalMonitorStateException car l'instance vers laquelle pointe 'a' n'est plus la même.

2voto

Stephen C Points 255558

Comment pouvons-nous utiliser cela pour obtenir un meilleur idée de l'endroit où se trouve le bug dans notre code ? Y a-t-il autre chose que nous puissions faire [ ] actuellement) pour localiser la fonction ou la ligne qui a échoué ?

Dans ce cas, l'impression du message en soi ne sera probablement pas d'une grande utilité. Ce dont vous avez besoin, c'est d'un suivi de pile avec les noms des fichiers sources et les numéros de ligne .

  1. Assurez-vous que tous les fichiers ".class" / JARs pertinents ont été construits avec les informations de débogage du fichier et du numéro de ligne inclus. C'est la valeur par défaut, mais la compilation avec "-g:none" enlèvera ces informations... tout comme la plupart des obfuscateurs de fichiers JAR.

  2. Ensuite, ajoutez un bloc try / catch pour attraper la IllegalMonitorStateException et soit appeler ex.printStackTrace() ou enregistrez l'exception.

À partir de la trace de la pile, vous devriez être en mesure de voir quelle ligne du code a déclenché l'exception. Il est probable qu'il s'agisse d'un appel à Object.wait(...) ou quelque chose comme ça. Consultez la javadoc de la méthode incriminée pour savoir dans quelles circonstances l'exception est levée.

(Et une fois que vous avez terminé, n'oubliez pas de déplacer le bloc try / catch que vous avez ajouté).

0voto

Lawrence Dol Points 27976

Vous devez imprimer la trace de la pile, qui vous donnera l'emplacement exact dans la source.

Malheureusement, il n'est pas rare que la JVM lève des exceptions qui ne contiennent aucun message détaillé pour faciliter le débogage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X