簡體   English   中英

拋出:IllegalMonitorStateException

[英]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'指向的實例不再相同。

我們如何使用它來更好地了解錯誤在我們的代碼中的位置? 除了我們目前正在進行的大量調試之外,我們還能做些什么來查明失敗的功能或線路嗎?

在這種情況下,單獨打印消息可能無濟於事。 您需要的是具有源文件名和行號的堆棧跟蹤。

  1. 確保所有相關的“.class”文件/ JAR都是使用包含的文件和行號調試信息構建的。 這是默認設置,但使用“-g:none”進行編譯將刪除此...大多數JAR文件混淆器也將如此。

  2. 接下來,添加一個try / catch塊來捕獲IllegalMonitorStateException並調用ex.printStackTrace()或記錄異常。

從堆棧跟蹤中,您應該能夠看到代碼中的哪一行引發了異常。 可能是對Object.wait(...)或類似的東西的調用。 檢查javadoc是否有違規方法,以找出導致異常的環境。

(一旦完成,請記住移動您添加的try / catch塊。)

您應該打印堆棧跟蹤,這將為您提供源中的確切位置。

不幸的是,JVM拋出不包含詳細消息的異常以幫助調試並不罕見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM