抛出:IllegalMonitorStateException

Bee*_*ake 11 java multithreading

运行我们的程序时,我们得到java.lang.IllegalMonitorStateException类型的异常.在Java6 API网站上,它说有一个构造函数提供有关异常的详细信息:IllegalMonitorStateException(String s)

我们如何使用它来更好地了解错误在我们的代码中的位置?还有什么我们可以做的(除了我们目前正在进行的大量调试)以确定失败的功能或线路吗?

use*_*421 14

创建Exception时必须提供详细信息(构造函数,对吗?),如果您没有创建它,则无法提供详细信息.

您可以分析异常的StackTrace.它显示了被调用以引起异常的类,方法和源行.

其中一个原因IllegalMonitorStateException是尝试在没有同步的情况下等待对象.见Javadoc.

还有其他可能的原因,某些库/外部代码可能会抛出异常.我认为只有StackTrace可以帮助...


kmc*_*ire 9

这可能是因为您正在调用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();
}
Run Code Online (Sandbox Code Playgroud)

这将抛出IllegalMonitorStateException因为'a'指向的实例不再相同.


Law*_*Dol 0

您应该打印堆栈跟踪,这将为您提供源中的确切位置。

不幸的是,JVM 抛出不包含帮助调试的详细消息的异常的情况并不少见。