1

HashMap<String,String>aに a を追加すると、次の問題が発生しTreeSet<HashMap<String,String>>ます。コードは次のとおりです。

... Do something
XMLRoot root = XMLRoot
.newBuild()
.setTrx(
    Tag
    .newBuild()
    .setName("trx")
    .addAttribute("type", "04/01")
    .addAttribute("id", id));
... => BreakPoint here!

メソッドaddAttribute()が行うことは次のとおりです。

public Tag addAttribute(String name, String value) {
    // Create the attribute.
    HashMap<String, String> att = new HashMap<String, String>();
    att.put(name, value);

    attributes.add(att);
    return this;
}

attributes変数は type のコレクションですTreeSet<HashMap<String,String>>。現在、Netbeans デバッガーを使用して、XMLRoot オブジェクトの作成直後にブレークポイントを追加しましたが、ブレークポイントに到達しないことがわかりました。問題は、例外がスローされず、エラーも何も発生しないことです。別の奇妙なことは、addAttribute()メソッドを使用して要素を 1 つだけ追加すると、すべて正常に機能することです。

質問: 2 番目の要素の TreeSet クラスの add() メソッド内で実行が終了する原因は何ですか?

注:デバッガーを使用して、最初の属性が設定されていることを確認できましたが、2 番目の属性には到達しませんでした。これは、2 番目の要素の追加中に実行が突然終了したことを意味します。

詳細: Apple JDK 1.6.0_51 64 ビット OSX 10.8.4 (Mountain Lion)

4

1 に答える 1

1

ClassCastExceptionの要素はTreeSet実装する必要があり、実装ComparableHashMapないため、ほぼ確実に を取得しています。正直なところ、コンパイラがこれを許可していることに驚きました。TreeSet私は、そのパラメータ化でより明確になると思いました。

イベントディスパッチスレッドでこれを実行しているとあなたは言います。EDT には、キャッチされない例外ハンドラーがあり、通常は StdErr に例外を出力しますが、それ以外の場合は無視します。メッセージが表示されない場合は、このハンドラーがアプリケーションによって置き換えられた可能性があります。

于 2013-08-21T19:24:07.783 に答える