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を使用しています..どんな体でも私の疑問を明確にすることができます...
TreeSet#addのドキュメント in Java 7の状態:
NullPointerException-指定された要素がnullであり、このセットが自然順序付けを使用している場合、またはそのコンパレータがnull要素を許可していない場合
したがって、null値を処理できるカスタムコンパレータ実装を指定していないため、NPEを取得します。
編集:Java 6)のnull
/TreeSet
の最初の要素としてTreeMap
要素を追加することは可能でしたが、 バグ と見なされます:
これは、最初の要素に空のTreeSet
の場合、null値を挿入できるためですが、他のオブジェクトを挿入しようとすると、その最初の値を挿入した後、NullPointerException
を取得します。
空でないTreeSet
の場合、実行時にnull値を挿入しようとすると、NullPointerException
が取得されます。これは、ツリーにいくつかの要素が存在する場合、オブジェクトを挿入する前に、compareTo()
メソッドを使用して新しいオブジェクトを既存のオブジェクトと比較し、新しいオブジェクトを配置する場所を決定するためです。したがって、nullを挿入することにより、compareTo()
メソッドは内部的にNullPointerException
をスローします。
Javaの新しいバージョンでは、nullの挿入は許可されていないと思います。
APIの説明:
概要:TreeMapに無効な要素を挿入するとNPEがスローされます説明:Java.util.TreeMapのエラーにより、以前は無効なnull要素とComparableインターフェイスを実装していない要素を空のTreeMapまたはTreeSetに挿入できました。空のTreeMapまたはTreeSetに挿入できる無効な要素は1つだけです。追加の要素により、予期されるNullPointerExceptionまたはClassCastExceptionが発生します。コレクションに対する他のほとんどの操作も失敗します。 Java SE 7の時点で、無効なnull要素またはComparableを実装していない要素を空のTreeMapまたはTreeSetに挿入すると、NullPointerExceptionがスローされます。
1.7以降、TreeSetはnullをまったく受け入れません。追加を強制すると、NullPointerExceptionが発生します。 1.6までnullは最初の要素としてのみ受け入れられました。
TreeSetは、内部的にComparableインターフェイスを使用して、要素を昇順で並べ替えます。 ComparableインターフェイスのcompareTo()メソッドは、2つの値を相互に比較して、より大きな値を見つけます。 nullを要素として追加した場合、nullを他の値と比較して、どちらが大きいか大きいかを判断できないため、compareTo()メソッドはNullPointerExceptionをスローします。
TreeSetでのaddメソッドの宣言は、
public boolean add(E e) throws ClassCastException, NullPointerException;
Javaバージョン1.7以降では、ツリーセットの最初の要素がnullとして許可されないため、ランタイム例外-NullPointerExceptionが発生します。Java 1.6最初の要素にnullを追加するときにもコンパイルおよび実行されますが、その後に要素を追加すると、nullポイント例外が発生します。
空のTreeSetを最初の要素としてnull挿入することができます。しかし、そのnullを挿入した後、要素を挿入しようとすると、NullPointerExceptionが発生します。また、空のTreeSetの場合、nullを挿入しようとすると、NullPointerExceptionが発生します。