0

java1.6.0_22-b04sunとtomcat6.0.32で実行されている2つの異なるサーバーにJavaアプリケーションをインストールしています。

ステージングサーバーが原因で、次のエラーで頭痛が発生します。

java.lang.UnsupportedOperationException : null
   java.util.AbstractMap$SimpleImmutableEntry.setValue (AbstractMap.java:726)

この例外を発生させるコードは次のとおりです

for (Entry<Integer, BigDecimal> entry : map.entrySet()) {
  entry.setValue(new BigDecimal("999"));
}

このサーバーでのみこの問題が発生しています。ローカルでも、同じコードを使用する他のサーバーでも、すべて問題ありません。

私はこの例外についてグーグルでたくさんの結果を見つけました、しかしそれらはすべてハドソンにリンクされていました。

4

3 に答える 3

4

例外をスローしたコメントサーバーで述べたように、-XX:+AggressiveOptsオプションで開始されていました。
JDK-7006877-XX:+AggressiveOptsは、動作が変更される理由を説明していTreeMapます。

TreeMapの実験的な実装は、1.6.0_14で追加されました。http://www.oracle.com/technetwork/java/javase/6u14-137039.html#performance-6u14
この

新しい実装は、コマンドラインオプション-XXを介して有効になります。 +AggressiveOpts。

標準のTreeMap実装では、TreeMapのイテレータによって返されるMap.Entryキーと値のペアの値は、Map.Entry.setValue()を呼び出すことで変更できます。

実験的な実装を有効にすると、この方法で値を変更することはできません。Map.Entry.setValue()を呼び出すと、UnsupportedOperationExceptionが発生します。

于 2016-05-06T14:17:20.480 に答える
2

これが失敗する簡単な例を提供できますか?

TreeMap<Integer, BigDecimal> map = new TreeMap<>();
map.put(0, BigDecimal.ZERO);
map.put(1, BigDecimal.ONE);

for (Map.Entry<Integer, BigDecimal> entry : map.entrySet()) {
    entry.setValue(new BigDecimal("999"));
}
System.out.println(map);

プリント

{0=999, 1=999}

Java 6のTreeMapは、唯一のエントリに対して例外を与えます

map.floorEntry(1).setValue(BigDecimal.TEN); // fails.

ソースによると、ConcurrentSkipListMapのみがこのクラスを使用します。

Map<Integer, BigDecimal> map = new ConcurrentSkipListMap<>();

いつも私にくれます

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractMap$SimpleImmutableEntry.setValue(AbstractMap.java:759)

ところで:Java6と7でも同じ動作がします。

于 2012-08-29T15:56:00.830 に答える
1

Java 6のTreeMapJavadocから:

このクラスのメソッドによって返されるすべてのMap.Entryペアとそのビューは、それらが作成されたときのマッピングのスナップショットを表します。それらはメソッドをサポートしていません。Entry.setValue(ただし、putを使用して、関連付けられたマップのマッピングを変更できることに注意してください。)

それで-なぜあなたは驚いているのですか?

于 2012-08-29T16:58:58.183 に答える