5

ここで明らかな何かが欠けている可能性があると思いますが、とにかくコードを見てみましょう。

public static class FreeMap extends TreeMap<String, Integer> {
    @Override
    public Integer put(String key, Integer value) {
        out.println(super.toString());
        out.println(super.getClass().getName()+" "+key+" : "+value);
        int i = super.put(key, value);//line 227
        assert this.size() == 1;
        return i;
    }

}
public static void main(String[] args) {
    FreeMap fm = new FreeMap();
    fm.put("A", 10);
}

これを実行すると、次のような出力が得られます。

{}
com.xxxxxxxxxxxxxxxxxxxxxxxx.Graph$FreeMap A : 10
Exception in thread "main" java.lang.NullPointerException
at com.xxxxxxxxxxxxxxxxxxxxxxxx.Graph$FreeMap.put(Graph.java:227)
at com.xxxxxxxxxxxxxxxxxxxxxxxx.Graph.main(Graph.java:212)

スーパーが TreeMap ではなく FreeMap を参照していることがわかります。それが StackOverflow Exception をスローしていれば、理解できたはずです。なぜ nullpointerexception なのですか?

前もって感謝します

4

1 に答える 1

11

はい、put前の値を返すため:

戻り値:
キーに関連付けられた以前の値、またはキーのマッピングがなかった場合は null。(null 戻り値は、マップが以前に null をキーに関連付けていたことを示す場合もあります。)

以前の値nullないため、 が返され、ボックス化解除され、例外が発生します。

メソッドがすでに return と宣言されているInteger場合、修正は簡単です。これを変える:

int i = super.put(key, value);

これに:

Integer i = super.put(key, value);

または理想的には、読みやすさのために:

Integer oldValue = super.put(key, value);

これは、キーの値既に存在する場合にもより効率的であることに注意してください。ボックス化解除と再ボックス化の利点はありません。

于 2013-01-12T16:56:30.967 に答える