-1

わかりました、少し個人的なプログラミング プロジェクトとして、私は過去に (GUI を介して) ゲーム内の特定のものからのアイテム ドロップのデータを記録するプログラムを作成しようとしていました (興味がある場合はギルド ウォーズ 2)。 . GUI は十分に単純です: 2 つのとJFrameを含み、何を入力するか、それを入力するためのテキスト フィールドを入力します。基本的な GUI のもの。入力は商品名と金額です。また、2 つの があり、それぞれアイテムの追加と削除を行うリスナーと、エラー メッセージの表示として機能するもう 1 つのリスナーがあります。JLabelsJTextFieldsJButtonsJLabel

取得した金額への項目の「マッピング」の構造は、Java プログラムの実行中にTreeMap.

私は大雑把で基本的な実装を作成し、データを .csv ファイルでメモリに保存していましたが、昨夜、システムを作り直すことにしました。そこで、スプレッドシート形式に「書き込もう」というアイデアを思いつき、「なぜ OpenOffice を使わないのか?」と考えました。その結果、ODFToolkit API などを発見しました。具体的には ODFDOM ツールに興味がありました。それで、私はこのようなものを十分にリファクタリングし(それが正しい用語であれば)、物事はスムーズに進むと思っていましたが...ここに私の問題があります:

そこで、GUI でテスト入力を入力します。「腐った卵」は有効なアイテムです (無効なアイテムはウィンドウにエラーを表示します)、取得した金額に正の整数 (有効な「金額」のタイプのみ) を入力します。これを初めて実行すると、このような有効な入力で問題なく動作しますが、別の入力または同じ入力で再試行すると、無効な項目が入力された場合にのみ表示されるエラー テキストが表示されます。私は少なくともそれをデバッグするためにいくつかのことを試みましたが、この恐ろしいバグがどのように作成されたかについては途方に暮れています.

ここで、私自身の 2 つのクラスの Pastebin にリンクします : GUI
クラス: http://pastebin.com/rEbFS27j
Map

4

1 に答える 1

0

ため息、私は最終的にそれを理解しました。スプレッドシートに書き込むメソッドにこのループがあります。

while (it.hasNext() == true) {
            Map.Entry pairs = (Map.Entry)it.next();

            odt.getTableList().get(0).getCellByPosition("A" + i).setDisplayText((String) pairs.getKey()) ;
            odt.getTableList().get(0).getCellByPosition("B" + i).setDisplayText((pairs.getValue().toString())) ;
            it.remove(); // avoids a ConcurrentModificationException
            i++ ;
            }

it.remove()(「it」はイテレータ変数です)は致命的なエラーです...過去にイテレータの使用方法について調べたときにコピーアンドペーストした不幸な名残です... :/ 実際、それはの原因でしたこの恐ろしい「一度しか機能しない」種類のバグ。他人のコードのスニペットを自分の作品に貼り付けるときに、間違ったものや不要なものを使用していないことを確認する必要があると思います...

于 2013-06-19T05:00:28.667 に答える