2017-05-19 3 views
-3

私は60x /秒と呼ばれる同期メソッドを使用しています。このメソッドは、ArrayListが空であるかどうかをチェックします。Javaメソッドが偽であってもif-clauseに入る

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

なぜそれがあれば()その空かどうかに足を踏み入れることができます。でも、それが空だならば、それは

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()); 
} 

出力は次のようになります...もし、句の中に、手順?

方法は、私の見解では、すべての「リビング」箇条書きを更新し、「BulletManager」に呼び出されます。上記のコメントで示唆したよう

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

それが起こる可能性のある理由... – Andremoniy

+0

"なぜこれが起こりますか?"できない。あなたのコードをデバッグしようとしましたか?また、メソッドのスターに 'GAMEOBJECTSTOREMOVE.isEmpty()'を表示する必要があります。 – Turing85

+2

[mcve]を入力してください。 –

答えて

1

これは、スレッドセーフとは何の関係もありません。この減少したコードを見て:それは空ではない場合

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

そう、あなたはそれが空になって、その内容を消去し、その後、あなたはそれが空だということを印刷します。

既に空の場合は、空であることを印刷してください。

したがって、clearの後に続くSystem.out.printlnには常にが印刷されます。

+0

Okey私はそれを試したが同じ出力:(真、仕上げ、真、仕上げ) – Myrtium

+0

あなたは何を試みた?私はここにコードの変更を提案していない。私は 'GAMEOBJECTSTOREMOVE'の内容に何が起こったかを単に示しています。ループはそれを変更しないので無関係です。 –

+0

ああ、申し訳ありません...私は何らかの理由で縮小コードを提案したと思っていました...あまりにも恐ろしいmisstakeを参照してください – Myrtium

-1

Okey私は解決策を見つけました...私はちょっとばかげています... sooo dumb ...私がBulletを作成すると、ObjectはGameManager "GAMEOBJECTLIST"とBulletManager "BULLETLIST"に追加されます...弾丸の最大距離に達した後、GameManagerのリストから削除されましたが、BulletManagerのリストから削除されました...これは穴の問題でした...今はすべて正常に動作します...私はばかだ...私はばかです...

関連する問題