Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [Java] threads probleem (https://forum.scholieren.com/showthread.php?t=1551501)

Engadin 05-03-2007 16:22

[Java] threads probleem
 
Ik ben voor school spaceinvaders aan het bouwen. Nu kreeg ik de volgende error als ik probeer een kogel aan te maken (door op spaciebalk te duwen).

Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:44 9)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at spaceinvaders.Game.update(Unknown Source)
at spaceinvaders.Game.run(Unknown Source)
at java.lang.Thread.run(Thread.java:595)

Ik denk dat het fout gaat omdat er op het ene punt variabele fire gelezen wordt, en op de andere plek geschreven. Zoiets zou je op moeten lossen met synchronize of lock ofzo, maar als ik dat doe:
PHP-code:

 regel 184
fire
.lock( );
if(
fire == 1)
      
bullets.add(ship.fire(cycle));
fire.unlock( ); 

spaceinvaders/Game.java:184: int cannot be dereferenced

Ik heb geen idee hoe ik dit op moet lossen.

Sources: http://merops.njn.nl/~vasco/java/spaceinvaders/

12Trix 05-03-2007 20:02

Citaat:

Engadin schreef op 05-03-2007 @ 17:22 :
Ik ben voor school spaceinvaders aan het bouwen. Nu kreeg ik de volgende error als ik probeer een kogel aan te maken (door op spaciebalk te duwen).

Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:44 9)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at spaceinvaders.Game.update(Unknown Source)
at spaceinvaders.Game.run(Unknown Source)
at java.lang.Thread.run(Thread.java:595)

Ik denk dat het fout gaat omdat er op het ene punt variabele fire gelezen wordt, en op de andere plek geschreven. Zoiets zou je op moeten lossen met synchronize of lock ofzo, maar als ik dat doe:
PHP-code:

 regel 184
fire
.lock( );
if(
fire == 1)
      
bullets.add(ship.fire(cycle));
fire.unlock( ); 

spaceinvaders/Game.java:184: int cannot be dereferenced

Ik heb geen idee hoe ik dit op moet lossen.

Sources: http://merops.njn.nl/~vasco/java/spaceinvaders/

Je zou misschien het volatile keyword aan de variabele declaratie van fire kunnen toevoegen:
PHP-code:

private volatile int fire


Engadin 05-03-2007 21:06

Dankjewel!

Hmm, blijkbaar zat het toch niet met die fire. Het komt wss omdat ik dan eindelijk een kogel in mijn lijst met kogels heb. Waarschijnlijk hgaat het verwerken daarvan fout, maar ik zie absoluut niet hoe:
PHP-code:

           i=0;
          
it bullets.iterator();
          
Alien bullet;
          while(
it.hasNext())
          {
              
it.next();
              
bullet = (Alien)bullets.get(i);
              
bullet.mover();
              
Iterator at aliens.iterator();
              
int j 0;
              while(
at.hasNext())
              {
                  
at.next();
                  
alien = (Alien)aliens.get(j);
                  if(
this.sameplace(bullet.movetype,alien.movetype) && bullet.life && alien.life 0)
                  {
                      
bullet.life--;
                      
alien.life--;
                      
aliens.set(j,alien);
                  }
              }
              if(
this.sameplace(bullet.movetype,ship.movetype) && bullet.life 0)
              {
                  
bullet.life--;
                  
this.hit();
              }
              if(
bullet.life <= 0
                  
|| bullet.pos[0]
                  || 
bullet.pos[0] > 200
                  
|| bullet.pos[1]
                  || 
bullet.pos[1] > 500
              
)
              {
                  
bullets.remove(i);
              }
              else
              {
                  
bullets.set(ibullet);
                  
// teken
                  
buffer.setColor(Color.green);
                  
buffer.fillRect(bullet.pos[0]-1500-bullet.pos[1]-10110);
              }
          } 


12Trix 06-03-2007 18:51

Kijk maar eens naar deze pagina:
http://java.sun.com/j2se/1.5.0/docs/...ArrayList.html

Hier staat onder andere:

Citaat:

The iterators returned by this class's iterator and listIterator methods are fail-fast: if list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Engadin 07-03-2007 16:41

A fijn, dat was het dus. Heb dat nu gefixt. Het volgende probleem wat ik heb is dat mijn scheepje wegvliegt als ik op spacebar duw. Dit gebeurd ergens in Game.java:194. Hierna zijn opeens de variabelen van mijn scheepje (ship.pos) aangepast :S Iemand een idee hoe dit komt?

12Trix 07-03-2007 18:31

Citaat:

Engadin schreef op 07-03-2007 @ 17:41 :
A fijn, dat was het dus. Heb dat nu gefixt. Het volgende probleem wat ik heb is dat mijn scheepje wegvliegt als ik op spacebar duw. Dit gebeurd ergens in Game.java:194. Hierna zijn opeens de variabelen van mijn scheepje (ship.pos) aangepast :S Iemand een idee hoe dit komt?
Lees dit maar eens:
http://www.cs.toronto.edu/~dianeh/tutorials/params/

Je geeft steeds een positie array door als parameter. Binnen de methodes van je applet worden deze posities veranderd omdat een array doorgegeven wordt als een verwijzing (of eigenlijk is het zelf een verwijzing). Tenminste, ik denk dat dat het punt is.

eddie 07-03-2007 19:32

Citaat:

Engadin schreef op 07-03-2007 @ 17:41 :
A fijn, dat was het dus. Heb dat nu gefixt. Het volgende probleem wat ik heb is dat mijn scheepje wegvliegt als ik op spacebar duw. Dit gebeurd ergens in Game.java:194. Hierna zijn opeens de variabelen van mijn scheepje (ship.pos) aangepast :S Iemand een idee hoe dit komt?
Pass by reference.

Engadin 08-03-2007 21:33

Ben nu een stuk verder, http://merops.njn.nl/~vasco/java/Game.html, maar door het een of andere heb ik ruzie in Alien.java:76 , hij wil daar geen image object aanmaken:

lien.java:76: cannot find symbol
[javac] symbol : method getImage(java.net.URL)
[javac] location: class spaceinvaders.Alien
[javac] img = getImage(tmp);

12Trix 09-03-2007 00:25

Citaat:

Engadin schreef op 08-03-2007 @ 22:33 :
Ben nu een stuk verder, http://merops.njn.nl/~vasco/java/Game.html, maar door het een of andere heb ik ruzie in Alien.java:76 , hij wil daar geen image object aanmaken:

lien.java:76: cannot find symbol
[javac] symbol : method getImage(java.net.URL)
[javac] location: class spaceinvaders.Alien
[javac] img = getImage(tmp);

getImage(URL) hoort bij de klasse Applet, Alien niet. ;)

De Toolkit klasse heeft ook een getImage(URL) methode:
http://scv.bu.edu/Doc/Java/tutorial/...ingImages.html

Engadin 12-03-2007 18:36

Citaat:

12Trix schreef op 09-03-2007 @ 01:25 :
getImage(URL) hoort bij de klasse Applet, Alien niet. ;)

De Toolkit klasse heeft ook een getImage(URL) methode:
http://scv.bu.edu/Doc/Java/tutorial/...ingImages.html

Hmm, door het een of andere krijg ik het niet werkend. Nu online er redelijk werkend: http://merops.njn.nl/~vasco/java/Spa...ders/Game.html


Alle tijden zijn GMT +1. Het is nu 18:37.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.