web-dev-qa-db-ja.com

空のTreeSetにnullを追加すると、NullPointerExceptionが発生します

import Java.util.TreeSet;
class Test 
{
    public static void main(String[] args) 
    {
        TreeSet t=new TreeSet();
        t.add(null);
        System.out.println(t);
    }
}

出力:NullPointerException。私は多くの記事で、空のTreeSetが初めてnullを受け入れるが、NullPointerExceptionが発生していることを読みました... Java7を使用しています..どんな体でも私の疑問を明確にすることができます...

12
user3516780

TreeSet#addのドキュメント in Java 7の状態:

NullPointerException-指定された要素がnullであり、このセットが自然順序付けを使用している場合、またはそのコンパレータがnull要素を許可していない場合

したがって、null値を処理できるカスタムコンパレータ実装を指定していないため、NPEを取得します。

編集:Java 6)のnull/TreeSetの最初の要素としてTreeMap要素を追加することは可能でしたが、 バグ と見なされます:

19
NilsH

これは、最初の要素に空のTreeSetの場合、null値を挿入できるためですが、他のオブジェクトを挿入しようとすると、その最初の値を挿入した後、NullPointerExceptionを取得します。

空でないTreeSetの場合、実行時にnull値を挿入しようとすると、NullPointerExceptionが取得されます。これは、ツリーにいくつかの要素が存在する場合、オブジェクトを挿入する前に、compareTo()メソッドを使用して新しいオブジェクトを既存のオブジェクトと比較し、新しいオブジェクトを配置する場所を決定するためです。したがって、nullを挿入することにより、compareTo()メソッドは内部的にNullPointerExceptionをスローします。

Javaの新しいバージョンでは、nullの挿入は許可されていないと思います。

4
user7471158

APIの説明:

概要:TreeMapに無効な要素を挿入するとNPEがスローされます説明:Java.util.TreeMapのエラーにより、以前は無効なnull要素とComparableインターフェイスを実装していない要素を空のTreeMapまたはTreeSetに挿入できました。空のTreeMapまたはTreeSetに挿入できる無効な要素は1つだけです。追加の要素により、予期されるNullPointerExceptionまたはClassCastExceptionが発生します。コレクションに対する他のほとんどの操作も失敗します。 Java SE 7の時点で、無効なnull要素またはComparableを実装していない要素を空のTreeMapまたはTreeSetに挿入すると、NullPointerExceptionがスローされます。

2
Maddy

1.7以降、TreeSetはnullをまったく受け入れません。追加を強制すると、NullPointerExceptionが発生します。 1.6までnullは最初の要素としてのみ受け入れられました。

1
Sathya

TreeSetは、内部的にComparableインターフェイスを使用して、要素を昇順で並べ替えます。 ComparableインターフェイスのcompareTo()メソッドは、2つの値を相互に比較して、より大きな値を見つけます。 nullを要素として追加した場合、nullを他の値と比較して、どちらが大きいか大きいかを判断できないため、compareTo()メソッドはNullPointerExceptionをスローします。

TreeSetでのaddメソッドの宣言は、

public boolean add(E e) throws ClassCastException, NullPointerException;

0
Anil Nivargi

Javaバージョン1.7以降では、ツリーセットの最初の要素がnullとして許可されないため、ランタイム例外-NullPointerExceptionが発生します。Java 1.6最初の要素にnullを追加するときにもコンパイルおよび実行されますが、その後に要素を追加すると、nullポイント例外が発生します。

0
Ankit Tripathi

空のTreeSetを最初の要素としてnull挿入することができます。しかし、そのnullを挿入した後、要素を挿入しようとすると、NullPointerExceptionが発生します。また、空のTreeSetの場合、nullを挿入しようとすると、NullPointerExceptionが発生します。

0
Ashwini Raut