当运行我们的程序时,我们得到一个java.lang.IllegalMonitorStateException类型的异常。在Java6 API网站上,它说有一个构造函数给出了关于异常的详细信息: IllegalMonitorStateException(String s)
我们如何使用它来更好地了解我们代码中的bug在哪里?除了我们目前正在做的大量调试之外,我们还能做些什么来找出失败的函数或行?
发布于 2009-12-05 08:31:36
必须在创建异常时提供详细信息(构造函数,对吧?)如果你没有创建它,你就没有办法提供细节。
您可以分析异常的StackTrace。它显示了被调用来导致异常的类、方法和源行。
IllegalMonitorStateException的一个原因是试图在没有同步的情况下等待对象。请参阅Javadoc。
还有其他可能的原因,一些库/外部代码可能会抛出异常。我想只有StackTrace能帮上忙..。
发布于 2012-10-07 11:51:47
这可能是因为您正在调用的等待或通知对象的实例与您与之同步的实例不同。例如:
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‘指向的实例不再相同。
发布于 2009-12-05 08:46:30
我们如何使用它来更好地了解我们代码中的bug在哪里?除了我们目前正在做的大量调试之外,我们还能做些什么来找出失败的函数或行?
在这种情况下,仅打印消息本身可能不会有太大帮助。您需要的是一个包含源文件名和行号的堆栈跟踪。
IllegalMonitorStateException并调用ex.printStackTrace()或记录异常。从堆栈跟踪中,您应该能够看到代码中的哪一行抛出了异常。这很有可能是对Object.wait(...)或类似的东西的调用。检查javadoc中的违规方法,找出是什么情况导致抛出异常。
(完成后,记得移动添加的try / catch块。)
https://stackoverflow.com/questions/1850422
复制相似问题