首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalMonitorStateException

IllegalMonitorStateException
EN

Stack Overflow用户
提问于 2009-12-05 07:48:02
回答 4查看 21.2K关注 0票数 11

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

我们如何使用它来更好地了解我们代码中的bug在哪里?除了我们目前正在做的大量调试之外,我们还能做些什么来找出失败的函数或行?

EN

回答 4

Stack Overflow用户

发布于 2009-12-05 08:31:36

必须在创建异常时提供详细信息(构造函数,对吧?)如果你没有创建它,你就没有办法提供细节。

您可以分析异常的StackTrace。它显示了被调用来导致异常的类、方法和源行。

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

还有其他可能的原因,一些库/外部代码可能会抛出异常。我想只有StackTrace能帮上忙..。

票数 14
EN

Stack Overflow用户

发布于 2012-10-07 11:51:47

这可能是因为您正在调用的等待或通知对象的实例与您与之同步的实例不同。例如:

代码语言:javascript
复制
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‘指向的实例不再相同。

票数 9
EN

Stack Overflow用户

发布于 2009-12-05 08:46:30

我们如何使用它来更好地了解我们代码中的bug在哪里?除了我们目前正在做的大量调试之外,我们还能做些什么来找出失败的函数或行?

在这种情况下,仅打印消息本身可能不会有太大帮助。您需要的是一个包含源文件名和行号的堆栈跟踪。

  1. 确保构建的所有相关".class“文件/JAR都包含文件和行号调试信息。这是默认设置,但是使用"-g:none“编译将会删除这一点...与大多数JAR文件obfuscators.
  2. Next,一样,添加一个try / catch块来捕获IllegalMonitorStateException并调用ex.printStackTrace()或记录异常。

从堆栈跟踪中,您应该能够看到代码中的哪一行抛出了异常。这很有可能是对Object.wait(...)或类似的东西的调用。检查javadoc中的违规方法,找出是什么情况导致抛出异常。

(完成后,记得移动添加的try / catch块。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1850422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档