Hallo,
ich bekomme in einem Spiel, das ich gerade zum Üben programmiere, immer mal wieder folgende Fehlermeldung:
Gemäß API wird hier eine Liste doppelt modifiziert.
Wenn ich aber den Code durchgehe, stelle ich fest, dass in der auslösenden Methode meinse Codes - also Collision_Detection.detectHit(Collision_Detection.java:24) nur eine einzige Liste aufgerüfen wird.
Des Weiteren wird auch in den anderen Methoden, die letztendlich zum Aufruf der Methode führen, keine der betroffenen Listen bearbetiet.
Da sich der Aufruf in der Methode run() des einzigen Threads befindet, ist mir absolut schleierhaft, wieso hier dieser Fehler auftritt.
Wenn mir jemand helfen könnte, wäre das wunderbar.
Gruß
System.exit(0)
Anbei habe ich die betreffenden Methoden von unten nach oben, angehängt:
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
[JAVA=370] final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
[/code]
at java.util.AbstractList$Itr.next(AbstractList.java:343)
[JAVA=342]
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
[/code]
at DefendersOfEarth.Collision_Detection.detectHit(Collision_Detection.java:24)
[JAVA=17]
public static void detectHit(ArrayList <MySprite> List, ArrayList <MySprite> tobehit)
{
for (MySprite TBH : tobehit)
{
Rectangle Rect1 = new Rectangle(TBH.getX(), TBH.getY(), 40,40);
Rectangle Rect2 = new Rectangle();
for(MySprite S : List)
{
Rect2 = new Rectangle(S.getX(), S.getY(), 2, 5);
if (Rect1.intersects(Rect2))
{ TBH.setLebensPunkte(S.getLebensPunkte());
S.setLebensPunkte(S.getLebensPunkte());
}
}
}
}
[/code]
at DefendersOfEarth.SpielSteuerung.Logic_on_Collisions(SpielSteuerung.java:105)
[JAVA=102] private void Logic_on_Collisions()
{
if (justStars) return;
Collision_Detection.detectHit(myBullits, myAliens);
myBullits = Collision_Detection.deleteUsedSprite(myBullits);
myExplosions = Collision_Detection.deleteUsedSprite(myExplosions);
Collision_Detection.explodeAliens(this, myAliens, myShip);
myAliens = Collision_Detection.deleteUsedSprite(myAliens);
}
[/code]
at DefendersOfEarth.SpielSteuerung.moveandLogic(SpielSteuerung.java:144)
[JAVA=118] private void moveandLogic()
{
myShip.move(60);
myShip.doLogic(60);
for (MySprite S : myStars)
S.move(60);
for (MySprite S : myStars)
S.doLogic(60);
if (justStars) return;
for (MySprite S : myBullits)
S.move(60);
for (MySprite S : myBullits)
S.doLogic(60);
for (MySprite S : myAlienBullits)
S.move(60);
for (MySprite S : myAlienBullits)
S.doLogic(60);
for (MySprite S : myAliens)
S.move(60);
for (MySprite S : myAliens)
S.doLogic(60);
if (runme) Logic_on_Collisions();
for (MySprite S : myExplosions)
S.move(60);
for (MySprite S : myExplosions)
S.doLogic(60);
}
[/code]
at DefendersOfEarth.SpielSteuerung.runGame(SpielSteuerung.java:99)
[JAVA=82]
public void runGame()
{
if (myShip.istexplodier())
{
if((System.currentTimeMillis() - explosionTime) > 2000)
{
myShip.istexplodier(false);
runme = true;
}
}
if ((Aliens.getAnzahl() <=0) && (Level > 0))
{
if (Level == maxLevel) Level = 0;
Level +=1;
Parent.loadLevel(Level);
}
moveandLogic();
}[/code]
at DefendersOfEarth.myMain.run(myMain.java:130)
[JAVA=125] public void run()
{
while (GameIsRunning)
{
getDelta();
myGame.runGame();
// doubleBufferStrategy
do
{
do
{
final Graphics G = BF.getDrawGraphics();
FontMetrics FM = getFontMetrics(G.getFont());
try
{
myGame.drawBuffer(G, FM);
}
catch(ConcurrentModificationException Ex)
{
System.out.println(Ex);
}
G.dispose();
} while (BF.contentsRestored());
BF.show();
} while (BF.contentsLost());
delta = current - last;
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Logger.getLogger(myMain.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
[/code]
at java.lang.Thread.run(Thread.java:619)
[JAVA=617]
public void run() {
if (target != null) {
target.run();
}
}[/code]
ich bekomme in einem Spiel, das ich gerade zum Üben programmiere, immer mal wieder folgende Fehlermeldung:
Java:
Exception in thread "Thread-4" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at DefendersOfEarth.Collision_Detection.detectHit(Collision_Detection.java:24)
at DefendersOfEarth.SpielSteuerung.Logic_on_Collisions(SpielSteuerung.java:105)
at DefendersOfEarth.SpielSteuerung.moveandLogic(SpielSteuerung.java:144)
at DefendersOfEarth.SpielSteuerung.runGame(SpielSteuerung.java:99)
at DefendersOfEarth.myMain.run(myMain.java:130)
at java.lang.Thread.run(Thread.java:619)
BUILD SUCCESSFUL (total time: 51 seconds)
Gemäß API wird hier eine Liste doppelt modifiziert.
Wenn ich aber den Code durchgehe, stelle ich fest, dass in der auslösenden Methode meinse Codes - also Collision_Detection.detectHit(Collision_Detection.java:24) nur eine einzige Liste aufgerüfen wird.
Des Weiteren wird auch in den anderen Methoden, die letztendlich zum Aufruf der Methode führen, keine der betroffenen Listen bearbetiet.
Da sich der Aufruf in der Methode run() des einzigen Threads befindet, ist mir absolut schleierhaft, wieso hier dieser Fehler auftritt.
Wenn mir jemand helfen könnte, wäre das wunderbar.
Gruß
System.exit(0)
Anbei habe ich die betreffenden Methoden von unten nach oben, angehängt:
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
[JAVA=370] final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
[/code]
at java.util.AbstractList$Itr.next(AbstractList.java:343)
[JAVA=342]
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
[/code]
at DefendersOfEarth.Collision_Detection.detectHit(Collision_Detection.java:24)
[JAVA=17]
public static void detectHit(ArrayList <MySprite> List, ArrayList <MySprite> tobehit)
{
for (MySprite TBH : tobehit)
{
Rectangle Rect1 = new Rectangle(TBH.getX(), TBH.getY(), 40,40);
Rectangle Rect2 = new Rectangle();
for(MySprite S : List)
{
Rect2 = new Rectangle(S.getX(), S.getY(), 2, 5);
if (Rect1.intersects(Rect2))
{ TBH.setLebensPunkte(S.getLebensPunkte());
S.setLebensPunkte(S.getLebensPunkte());
}
}
}
}
[/code]
at DefendersOfEarth.SpielSteuerung.Logic_on_Collisions(SpielSteuerung.java:105)
[JAVA=102] private void Logic_on_Collisions()
{
if (justStars) return;
Collision_Detection.detectHit(myBullits, myAliens);
myBullits = Collision_Detection.deleteUsedSprite(myBullits);
myExplosions = Collision_Detection.deleteUsedSprite(myExplosions);
Collision_Detection.explodeAliens(this, myAliens, myShip);
myAliens = Collision_Detection.deleteUsedSprite(myAliens);
}
[/code]
at DefendersOfEarth.SpielSteuerung.moveandLogic(SpielSteuerung.java:144)
[JAVA=118] private void moveandLogic()
{
myShip.move(60);
myShip.doLogic(60);
for (MySprite S : myStars)
S.move(60);
for (MySprite S : myStars)
S.doLogic(60);
if (justStars) return;
for (MySprite S : myBullits)
S.move(60);
for (MySprite S : myBullits)
S.doLogic(60);
for (MySprite S : myAlienBullits)
S.move(60);
for (MySprite S : myAlienBullits)
S.doLogic(60);
for (MySprite S : myAliens)
S.move(60);
for (MySprite S : myAliens)
S.doLogic(60);
if (runme) Logic_on_Collisions();
for (MySprite S : myExplosions)
S.move(60);
for (MySprite S : myExplosions)
S.doLogic(60);
}
[/code]
at DefendersOfEarth.SpielSteuerung.runGame(SpielSteuerung.java:99)
[JAVA=82]
public void runGame()
{
if (myShip.istexplodier())
{
if((System.currentTimeMillis() - explosionTime) > 2000)
{
myShip.istexplodier(false);
runme = true;
}
}
if ((Aliens.getAnzahl() <=0) && (Level > 0))
{
if (Level == maxLevel) Level = 0;
Level +=1;
Parent.loadLevel(Level);
}
moveandLogic();
}[/code]
at DefendersOfEarth.myMain.run(myMain.java:130)
[JAVA=125] public void run()
{
while (GameIsRunning)
{
getDelta();
myGame.runGame();
// doubleBufferStrategy
do
{
do
{
final Graphics G = BF.getDrawGraphics();
FontMetrics FM = getFontMetrics(G.getFont());
try
{
myGame.drawBuffer(G, FM);
}
catch(ConcurrentModificationException Ex)
{
System.out.println(Ex);
}
G.dispose();
} while (BF.contentsRestored());
BF.show();
} while (BF.contentsLost());
delta = current - last;
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Logger.getLogger(myMain.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
[/code]
at java.lang.Thread.run(Thread.java:619)
[JAVA=617]
public void run() {
if (target != null) {
target.run();
}
}[/code]
Zuletzt bearbeitet: