[英]IllegalMonitorStateException
運行我們的程序時,我們得到java.lang.IllegalMonitorStateException類型的異常。 在Java6 API網站上,它說有一個構造函數提供有關異常的詳細信息:IllegalMonitorStateException(String s)
我們如何使用它來更好地了解錯誤在我們的代碼中的位置? 除了我們目前正在進行的大量調試之外,我們還能做些什么來查明失敗的功能或線路嗎?
創建Exception時必須提供詳細信息(構造函數,對嗎?),如果您沒有創建它,則無法提供詳細信息。
您可以分析異常的StackTrace。 它顯示了被調用以引起異常的類,方法和源行。
IllegalMonitorStateException
一個原因是嘗試在沒有同步的情況下等待對象。 見Javadoc 。
還有其他可能的原因,某些庫/外部代碼可能會拋出異常。 我認為只有StackTrace可以幫助...
這可能是因為您正在調用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'指向的實例不再相同。
我們如何使用它來更好地了解錯誤在我們的代碼中的位置? 除了我們目前正在進行的大量調試之外,我們還能做些什么來查明失敗的功能或線路嗎?
在這種情況下,單獨打印消息可能無濟於事。 您需要的是具有源文件名和行號的堆棧跟蹤。
確保所有相關的“.class”文件/ JAR都是使用包含的文件和行號調試信息構建的。 這是默認設置,但使用“-g:none”進行編譯將刪除此...大多數JAR文件混淆器也將如此。
接下來,添加一個try / catch塊來捕獲IllegalMonitorStateException
並調用ex.printStackTrace()
或記錄異常。
從堆棧跟蹤中,您應該能夠看到代碼中的哪一行引發了異常。 可能是對Object.wait(...)
或類似的東西的調用。 檢查javadoc是否有違規方法,以找出導致異常的環境。
(一旦完成,請記住移動您添加的try / catch塊。)
您應該打印堆棧跟蹤,這將為您提供源中的確切位置。
不幸的是,JVM拋出不包含詳細消息的異常以幫助調試並不罕見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.