抛出:IllegalMonitorStateException

时间:2009-12-04 23:48:02

标签: java multithreading

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

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

4 个答案:

答案 0 :(得分:14)

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

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

IllegalMonitorStateException的一个原因是尝试在没有同步的情况下等待对象。请参阅Javadoc

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

答案 1 :(得分: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();
}

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

答案 2 :(得分:2)

  

我们怎样才能用它来改善   想法我们的代码中的bug在哪里?   还有什么我们可以做的   (除了我们的大量调试   目前正在努力查明   失败的功能或线路?

在这种情况下,单独打印消息可能无济于事。您需要的是具有源文件名和行号的堆栈跟踪

  1. 确保所有相关的“.class”文件/ JAR都是使用包含的文件和行号调试信息构建的。这是默认设置,但使用“-g:none”进行编译将删除此...大多数JAR文件混淆器也将如此。

  2. 接下来,添加一个try / catch块来捕获IllegalMonitorStateException并调用ex.printStackTrace()或记录异常。

  3. 从堆栈跟踪中,您应该能够看到代码中的哪一行引发了异常。很有可能是对Object.wait(...)或类似事件的调用。检查javadoc是否有违规方法,找出导致异常的环境。

    (一旦完成,请记得移动你添加的try / catch块。)

答案 3 :(得分:0)

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

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