IllegalMonitorStateException

При запуске нашей программы мы получаем исключение типа java.lang.IllegalMonitorStateException. На веб-сайте API Java6 говорится, что есть конструктор, в котором содержится информация об исключении: IllegalMonitorStateException (String s)

Как мы можем использовать это, чтобы лучше понять, где ошибка в нашем коде? Есть ли что-нибудь еще, что мы можем сделать (помимо большого количества отладки, которые мы сейчас делаем), чтобы определить функцию или строку, которая не удалась?

Ответ 1

Подробности должны быть заданы при создании исключения (конструктор, правильно?), и если вы его не создаете, вы не можете предоставить подробные сведения.

Вы можете проанализировать StackTrace Исключения. Он показывает классы, методы и линию суса, которые вызывались, чтобы вызвать исключение.

Одна из причин, почему IllegalMonitorStateException пытается подождать объект, не синхронизировавшись с ним. См. Javadoc.

Существуют и другие возможные причины, и исключение может быть вызвано некоторым библиотечным/внешним кодом. Я думаю, что только StackTrace может помочь...

Ответ 2

Возможно, это происходит потому, что экземпляр объекта, который вы вызываете wait или notify on, отличается от экземпляра, с которым вы синхронизировали. Например:

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();
}

Это вызовет IllegalMonitorStateException, потому что экземпляр, который указывает 'a', больше не то же самое.

Ответ 3

Как мы можем использовать это, чтобы получить лучшее идея о том, где ошибка в нашем коде? Есть ли что-то еще, что мы можем сделать (помимо множества отладки, которые мы в настоящее время), чтобы определить не удалось выполнить функцию или строку?

В этом случае печать сообщения сама по себе, вероятно, не поможет. Вам понадобится stacktrace с именами исходных файлов и номерами строк.

  • Убедитесь, что все соответствующие файлы .class/JAR были созданы с включенной информацией об отладке файла и строки. Это значение по умолчанию, но компиляция с помощью "-g: none" разделит это... как и большинство обернутых файлов JAR.

  • Затем добавьте блок try/catch, чтобы поймать IllegalMonitorStateException и либо вызвать ex.printStackTrace(), либо записать исключение.

Из stacktrace вы сможете увидеть, какая строка в коде выдала исключение. Вероятно, это был вызов Object.wait(...) или что-то в этом роде. Проверьте javadoc для метода оскорбления, чтобы выяснить, какие обстоятельства вызывают исключение.

(И как только вы закончите, не забудьте переместить блок try/catch, который вы добавили.)

Ответ 4

Вы должны распечатать трассировку стека, которая даст вам точное местоположение в источнике.

К сожалению, для JVM не редко встречаются исключения, которые не содержат подробного сообщения, чтобы помочь в отладке.