2016-04-19 12 views
0

現在、私はLWJGL 3.0.0bを使用しているゲームを開発しています。ArrayList size()メソッドがクラッシュするプログラム

背景:。

は、私は私のエンティティを保存するために、カスタムエンティティクラスとエンティティマネージャを持つエンティティが更新されると方法を作るために、トレイルエンティティに追加されます「tickTrail」という名前呼び出されますグラフィックスは視覚的に優れ、面白くなります。

すでに私ははい、私はこれを自分で解決しようとすると、entities.size()関数にそれを単純化している:P

私は現在、これに似たすべてのメソッド交換されている解決策:交換する

for (int i = 0; i < entities.size(); i++) 
{ 
    //calls a method for drawing, updating, or input 
} 

を毎回entities.size()sizeです。 sizeは、エンティティの追加、削除、リスト消去、または敵の削除のみが行われたときに変更される変数です。

このメソッドは、100%の作業を行いますが、このメソッドを使用してウィンドウをドラッグするとプログラムがクラッシュすることはありません。

質問

ので、合計する、最後の質問は、なぜこれが起こるんですか?なぜウィンドウをドラッグしてArrayListのsize()メソッドを使用するとプログラムがクラッシュするのか、変数をその場所に格納するのは完全にうまくいくのかどうかは分かりません。この奇妙な現象に

すべてのヘルプや説明は高く評価される:)

EDIT は最終編集プログラムがまだ、戻って描画ボードに行く時間がクラッシュし、使用中でもサイズの変数で、間違って証明しましたオーケー....

EDIT TWO 、ウィンドウのドラッグがそうでない他の回で動作しますので、時々、これは単純なサイズよりも()メソッドの呼び出しであるかもしれない:/

+0

クラッシュすると、プログラムがクラッシュするだけで、例外はありません。私はEclipse IDEを使用しているので、多分それだけです。 –

+0

私はこれまでに提示された情報をどのように手助けすることができるか分かりません。空のキャッチブロックはありませんか? Eclipseデバッガで実行しましたか?私はあなたの最良の賭けは今分けて征服すること、コードの自己完結型部分をテストすること、エラーの原因を特定するまで掘り下げることです。 –

+1

私のお金はNullPointerExceptionに... –

答えて

2

あなたが何を提供したかに基づいて、私は複数のスレッドが同時にArrayListにアクセスしていることを推測しており、スレッドは他のすべてのスレッドでストンプしています。

Collections.synchronizedList()でリストを作成していない場合、リスト内のすべての操作がアトミックで、配列の内部が壊れていないことを保証します。

私がこの道を辿ったのは、Windowsをドラッグすると複数のイベントが生成されて配列が更新されている可能性があり、同時にそのイベントを反復しようとしているからです。

変数を使用してサイズを監視すると、並行性の問題はなくなります。もちろん、AtomicIntegerなどを使用していない限り、変数に正しい値がない可能性がありますが、少なくとも例外はスローされません。

+0

良い推測、私は推測しています。 :) –

+0

'size()'メソッド自体は、同時の破損があってもクラッシュしません。その後、無効なインデックスによるアクセスが発生する可能性があります(例外メッセージで詳細がわかります)。 – Thilo

関連する問題