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 не редко встречаются исключения, которые не содержат подробного сообщения, чтобы помочь в отладке.