2017-05-19 8 views
-3

Ich verwende eine synchronisierte Methode, die 60x pro Sekunde genannt wird. Die Methode prüft, ob eine ArrayList leer ist oder nicht. Und auch wenn es leer ist, tritt sie in die if-Klausel ...Java-Methode Schritt in if-Klausel, obwohl es falsch ist

public synchronized void removeGameObjectsFromList() 
{ 
    if (!GAMEOBJECTSTOREMOVE.isEmpty()) 
    { 
     for (int i = 0; i < GAMEOBJECTSTOREMOVE.size(); i++) 
     { 
      GameObject obj = GAMEOBJECTSTOREMOVE.get(i); 
      getRegionNodes().getChildren().remove(obj.getCurrentImageView()); 
      GAMEOBJECTS.remove(obj.getNAME());    
     } 
     GAMEOBJECTSTOREMOVE.clear(); 
     System.out.println("Finished"); 
    } 
    System.out.println(GAMEOBJECTSTOREMOVE.isEmpty()); 
} 

Die Ausgabe sieht so aus:

{true 
Finished 
true 
Finished 
true 
true 
Finished 
true 
true 
Finished 
true} 

Warum kann es sollte in if(), ob seine leer?

Das Verfahren wird in einem „BulletManager“, die aktualisiert all „lebendes“ Bullets aus meiner Sicht:

AnimationTimer timer = new AnimationTimer() 
    { 
     @Override 
     public void handle(long now) 
     { 
      if (!(BULLETS.isEmpty())) 
      { 
       for (int i = 0; i < BULLETS.size(); i++) 
       { 
        Bullet currentBullet = BULLETS.get(i); 
        if (currentBullet.getDistance() > 0) 
        { 
          currentBullet.move(currentBullet.getANGLE()); 
          currentBullet.getCurrentImageView().setTranslateX(currentBullet.getCoordinate().getX()); 
          currentBullet.getCurrentImageView().setTranslateY(currentBullet.getCoordinate().getY()); 
         currentBullet.decrementDistance(); 
        } else 
        { 
         GAMEMANAGER.addGameObjectToBeRemoved(currentBullet); 

        } 
       } 

      } 
     } 
    }; 
    timer.start(); 
+2

Eine Menge Gründe warum es passieren könnte ... – Andremoniy

+0

"Warum kann das passieren?" Es kann nicht. Haben Sie versucht, Ihren Code zu debuggen? Außerdem sollten Sie 'GAMEOBJECTSTOREMOVE.isEmpty()' am Anfang der Methode ausgeben. – Turing85

+2

Bitte geben Sie eine [mcve] an. –

Antwort

1

Das hat nichts mit Thread-Sicherheit zu tun, wie oben in den Kommentaren vorgeschlagen. Schauen Sie sich diesen reduzierten Code:

if (!GAMEOBJECTSTOREMOVE.isEmpty()) 
{ 
    /* ... */ 
    GAMEOBJECTSTOREMOVE.clear(); 
    System.out.println("Finished"); 
} 
System.out.println(GAMEOBJECTSTOREMOVE.isEmpty()); 

Also, wenn es nicht leer ist, können Sie klar sein Inhalt, es leer zu machen, dann drucken Sie, dass es leer ist.

Und wenn es bereits leer ist, drucken Sie einfach, dass es leer ist.

Daher werden Sie immer true auf der zweiten System.out.println drucken, die nach der clear auftritt.

+0

Okey Ich habe es versucht, aber die gleiche Ausgabe: (true, Finished, true, Finished) – Myrtium

+0

Sie haben versucht ... was? Ich habe hier keine Änderung des Codes vorgeschlagen. Ich zeige nur, was mit dem Inhalt von "GAMEOBJECTSTOREMOVE" passiert; Die Schleife ist irrelevant, weil sie nicht mutiert. –

+0

Oh sorry ... Ich dachte, du hättest aus irgendwelchen Gründen deinen reduzierten Code vorgeschlagen ... Vielleicht siehst du auch einen hinterhältigen Fehler – Myrtium

-1

Okey Ich habe eine Lösung gefunden ... Ich bin nur dumm ... sooo dumm ... Wenn ich eine Kugel erstelle, wird das Objekt zum GameManager "GAMEOBJECTLIST" und zum BulletManager "BULLETLIST" hinzugefügt ... nach dem Erreichen der maximalen Entfernung des Geschosses, seine Entfernung aus der GameManager Liste, aber nicht aus der BulletManager Liste ... das war das Loch Problem ... Jetzt funktioniert alles gut ... Ich bin dumm

Verwandte Themen