2009-12-04 54 views
11

當運行我們的程序時,我們得到一個類型爲java.lang.IllegalMonitorStateException的異常。在Java6 API網站上,它說有一個構造函數提供了有關異常的詳細信息:IllegalMonitorStateException(String s)IllegalMonitorStateException

我們如何使用它來更好地瞭解錯誤在代碼中的位置?除了我們目前正在進行的大量調試之外,還有什麼可以做的事情來確定失敗的功能或線路嗎?

回答

0

你應該打印堆棧跟蹤,它會給你在源中的確切位置。

不幸的是,JVM拋出不包含詳細信息的異常來協助調試並不罕見。

14

創建Exception時必須給出細節(構造函數,對嗎?),如果不創建它,則無法提供細節。

您可以分析異常的StackTrace。它顯示被調用引起異常的類,方法和源代碼行。

IllegalMonitorStateException的一個原因是試圖在沒有同步的情況下等待對象。請參閱Javadoc

還有其他可能的原因和一些庫/外部代碼可能會拋出異常。我認爲只有堆棧跟蹤可以幫助...

2

我們如何利用這個來獲得的,其中的錯誤是在我們的代碼更好的 想法? 還有什麼我們可以做的 (除了大量的調試,我們現在正在做 )以查明 函數或失敗的線?

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

  1. 確保所有相關的「.class」文件/ JAR都包含文件和行號調試信息。這是默認設置,但使用「-g:none」進行編譯將會消除這個問題......就像大多數JAR文件混淆器一樣。

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

從stacktrace中你應該能夠看到代碼中的哪一行拋出異常。有機會,這是一個電話Object.wait(...)或類似的東西。檢查javadoc是否有問題的方法,以瞭解哪些情況會導致拋出異常。

(一旦完成後,記得要打動你添加的try/catch塊。)

9

這是可能發生的,因爲你是調用wait或通知的對象的實例,該實例不同你同步。例如:

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」點是不再相同。

相關問題