2013-05-18 124 views
0

我在併發修改異常錯誤中遇到了很多麻煩。在社區的幫助下,我設法解決了我最後的錯誤,但是我認爲這個錯誤更令人費解。繪畫併發修改異常原因?

現在我正在併發修改錯誤而畫,我擔心的是,在塗料功能本身出現此錯誤。不像我最後一個錯誤,我沒有去除一個實體,在這種情況下,我完全理解發生了什麼,而不是如何解決它,另一方面,我不明白這個錯誤。

TowerItr = activeTowers.iterator(); 

      while (TowerItr.hasNext()) { 
       try { 

       theTower = (ArcherTower) TowerItr.next(); 


       g.drawImage(tower, theTower.y * Map.blockSize, theTower.x * Map.blockSize, this); 

       } catch (ConcurrentModificationException e) { 


       } 
      } 

拋出異常的線,這是一個: theTower =(ArcherTower)TowerItr.next();

+0

你可以發佈stacktrace嗎? – NINCOMPOOP

+0

,你不應該捕獲ConcurrentModificationException。 –

+1

有些東西,有些正在對活動塔進行更改,這可能包括更改,添加或刪除元素。嘗試從'activeTowers'對象創建一個元素數組(你可能想鏈接到前一個問題,幷包含有關'activeTowers'實際上是什麼類型對象的詳細信息... – MadProgrammer

回答

3

總是有兩面的ConcurrentModificationException的(CME),只有一面報告錯誤。

在這種情況下,您的代碼看起來非常好。您正在循環訪問activeTowers的成員。

堆棧跟蹤會告訴你什麼是你不知道的....你有CME。

您需要找到的是其中您正在從activeTowers集合中添加/刪除數據。

在許多情況下,有相當容易修復。一個可能的解決辦法是同步訪問到中的每個使用它的activeTowers數組。這可能很難做到。

另一種方法是使用java.util.concurrent。*包中的一個集合,並使用toArray(...)方法獲取集合的快照,然後您可以在該集合中迭代該快照while循環。

// activeTower must be something from java.util.concurrent.* 
for (ArcherTower theTower : activeTower.toArray(new ArcherTower[0]) { 
    g.drawImage(tower, theTower.y * Map.blockSize, theTower.x * Map.blockSize, this); 
} 

我要補充一點,如果你使用的java.util.concurrent。*集合,然後迭代器()將返回一個「穩定」的迭代器太(不會拋出CME,以及可能(或可能不會)反映在集合中的變化)

底線是,CME只告訴你故事的一半....只有你的代碼會告訴你休息....

+0

有趣的部分是,除了添加元素之外,這是處理arraylist的唯一代碼。這是該代碼: 'Board.activeTowers.add(新ArcherTower(Input.getYArrayPos(),Input.getXArrayPos(),ArcherTower.tower1ID));' –

+0

打我給它+1 – MadProgrammer

+0

@nick這聽起來像你有兩個線程訪問列表 – MadProgrammer

0

從什麼我們尊敬的賬面上委員建議:

1)通常被看作該錯誤時Iterator已被提取後的List被修改。

2)我在看你的代碼,並在drawImage()方法的使用似乎好了,除了this。這可能會改變您的List,因爲This可以直接訪問class members/class variables

3)如果多個線程正在訪問List同時這也可以發生。其中一個線程可能試圖將List從其他共享List的實例的其他方法中更改。 I am saying some other method because concurrent read access should not create trouble if multiple threads were accessing this method

注意:請所有posible code和stake trace來調試確切的問題。