运行我们的程序时,我们得到java.lang.IllegalMonitorStateException类型的异常。在Java6 API网站上,它说有一个构造函数提供有关异常的详细信息:IllegalMonitorStateException(String s)
我们如何使用它来更好地了解错误在我们的代码中的位置?还有什么我们可以做的(除了我们目前正在进行的大量调试之外),以确定失败的功能或线路吗?
答案 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在哪里? 还有什么我们可以做的 (除了我们的大量调试 目前正在努力查明 失败的功能或线路?
在这种情况下,单独打印消息可能无济于事。您需要的是具有源文件名和行号的堆栈跟踪 。
确保所有相关的“.class”文件/ JAR都是使用包含的文件和行号调试信息构建的。这是默认设置,但使用“-g:none”进行编译将删除此...大多数JAR文件混淆器也将如此。
接下来,添加一个try / catch块来捕获IllegalMonitorStateException
并调用ex.printStackTrace()
或记录异常。
从堆栈跟踪中,您应该能够看到代码中的哪一行引发了异常。很有可能是对Object.wait(...)
或类似事件的调用。检查javadoc是否有违规方法,找出导致异常的环境。
(一旦完成,请记得移动你添加的try / catch块。)
答案 3 :(得分:0)
您应该打印堆栈跟踪,这将为您提供源中的确切位置。
不幸的是,JVM抛出不包含详细消息的异常以帮助调试并不罕见。