あなたのコードを知らずに見分けるのは難しいですが、ここで私が探し始めるいくつかのポイントがあります.
個々のクラスがすべて期待どおりに機能することを確認します。つまり、少なくともコア クラスを単体テストする必要があります。
追加のチェックのためにすべてのプライベート メソッドに assert-Statements を挿入して、ヘルパー メソッドに渡すデータが有効であることを確認します。(パブリック メソッドで assert を使用しないでください。そこでは例外を使用してください)。
ロギング (log4j などを使用している場合は DEBUG レベル) または単純な System.out.println() ステートメントをすべての重要なポイントに追加して、値が変化する場所を把握します。これは、データが実際にコードをどのように流れるかを理解するのに役立ちます。
Eclipse を使用しているため、デバッガーを使用してコードをステップ実行し、予期しないデータの変更を監視します。
誤った仮定をチェックします。これは、たとえば、純粋な true/false チェックではない条件の else ブロックのビジネス ロジックです。たとえば、GUI でこのようなコードをよく見かけます。
if (button == OK_BUTTON) {
doOkButton();
} else {
doCancelBotton(); // VERY dangerous. could be any Button
}
これを修正
if (button == OK_BUTTON) {
doOkButton();
} else if (button == CANCEL_BUTTON) {
doCancelBotton();
} else {
assert false : "Oops, a new button?"
}
あなたは乱数発生器を使用していると言いました。毎回正しいものを使用していて、出力にランダム性が追加されていませんか? 一体何のために使っているのですか?
時間ベースのものを使用していますか?たとえば System.currentTimeMillies?
正しいコレクションを使用していますか? すべてがソートおよび順序付けされているわけではなく、すべての要素を調べようとすると、アプリケーションが実行されるたびに異なる結果になる可能性があります。
コレクションで使用するすべてのクラスに適切な equals() と hashCode() があることを確認します
オートボクシングを使用していますか?比較は慎重に
new Integer(5) == new Integer(5)
値ではなく 2 つのオブジェクト参照を比較するため、false です。
Integer i = new Integer(5);
i++;
i++ で新しいオブジェクトを作成します。これらは見つけるのが難しく、ほとんどの場合、プリミティブとコレクションを操作すると、オートボクシングが発生します。
仮定を無効にする可能性のあるサードパーティのライブラリを使用していますか (競合状態など)
コードの静的分析には、FindBugsなどのツールを使用します。何かヒントになるかもしれません。
それが私が始めるところです。幸運を!