2012-03-07 57 views
0

我得到java.util.ConcurrentModificationException但我需要弄清楚哪一個班級給了我這個例外。代碼有很多類和包,很難找出錯誤的來源。例外顯示ArrayList的問題。當我在懷疑區域使用異常處理時,它不會被忽視。我們如何判斷哪個班級給出例外

任何出路?

+3

Stacktrace?也許? – 2012-03-07 14:17:52

+4

難道你沒有堆棧跟蹤? – talnicolas 2012-03-07 14:17:59

+0

如果您發佈代碼和異常堆棧跟蹤,它會更有用。這幾乎可以肯定是一個'ConcurrentModificationException',它是在迭代它時修改一個集合引起的。 – 2012-03-07 14:18:29

回答

2

如果您使用的是現代的IDE,月食例如,那麼你就可以運行在調試模式下的應用程序,並設置一個斷點上的任何異常。結果是:每次拋出異常(在整個JVM中),應用程序都會停止並獲得堆棧跟蹤。

這使得它很容易識別呼叫者(和實際線程,如果它是一個併發的問題)


playn.java.JavaGroupLayer.paint(JavaGroupLayer.java:96) 

那是壞人。這是paint方法你的JavaGroupLayer類。它可能有一個for循環遍歷數組列表,並且在它檢測到列表已被修改的時候。

在swing應用程序中使用線程嗎?在這種情況下,請仔細檢查它們是否不修改佈局。

+0

我正在使用Eclipse。我得到一個堆棧跟蹤。我已將上面的註釋複製到開頭。請看看。跟蹤從ArrayList.java開始,我需要弄清楚我的代碼的哪個類給出了問題。 – Rockcollins 2012-03-07 14:30:53

+0

謝謝。這將真的幫助我.. – Rockcollins 2012-03-07 14:35:00

+0

更新!我沒有正確讀取堆棧跟蹤。對不起。現在我命名正確的課程。 – 2012-03-07 15:02:03

1

通常開始於堆棧跟蹤的頂部,你寫/頭等艙承認你應該是你的切入點。之後,您可能會在其他類/方法中進行調用,因此您可以按照堆棧跟蹤以及違規代碼進行操作。

此外:你可能做什麼(我已經做了,在過去的自己)試圖修改的集合,而遍歷它。這就是併發修改的意思。試着看看你在做什麼,應該是這樣。

+0

實際上,它沒有顯示我的代碼類作爲入口點。它以ArrayList.java開頭。請參閱上面的評論以瞭解我的錯誤描述。 – Rockcollins 2012-03-07 14:25:25

+0

嗯,你可能使用JavaGroupLayer?或PlayN的東西?這可能是庫中的一個錯誤或不正確的用法。如果這是所有堆棧跟蹤,那肯定很難弄清楚。也許,將它發送到PlayN郵件列表並查看是否有人知道它 – Nasir 2012-03-07 14:31:45

+0

謝謝..這真的有幫助。 – Rockcollins 2012-03-07 14:33:42

1

從上到下瀏覽堆棧跟蹤,屬於源代碼的第一個類是從ArrayList嘗試對其執行非法操作的異常。然後檢查哪些線程同時訪問ArrayList的實例,並使用​​方法或​​塊來保護它。

+0

它不顯示屬於我的源代碼的任何類。跟蹤從ArrayList.java開始 – Rockcollins 2012-03-07 14:27:46

0

一個常見的錯誤是拋棄異常,只讀取消息或toString異常。如果您打印堆棧跟蹤,您將能夠精確地看到堆棧中每個級別的位置(類,方法和行)。

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException 
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782) 
at java.util.ArrayList$Itr.next(ArrayList.java:754) 
at playn.java.JavaGroupLayer.paint(JavaGroupLayer.java:96) 
at playn.java.JavaPlatform$1.paint(JavaPlatform.java:222) 
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5138) 
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:‌​1454) 
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1385) 

在您的IDE中,您應該可以單擊每行來查看所涉及的代碼。

鑑於這是一個包,它更可能的是,問題是你沒有正確使用的庫。看來plyn並不是多線程安全的,並且您試圖在另一個線程中更改數據結構,而不是使用交換AWT線程。

0

標識列表,然後要麼改變迭代使用列表迭代(對於i = 0;我<則爲list.size();我++),而不是迭代的迭代(對於x:列表)

或者可以做一個列表的淺表副本並迭代它。

相關問題