8

nullに許可されていると思いましたSet
では、なぜ次のコードを実行するのでしょうか。

SortedSet<Integer> set = new TreeSet<Integer>();  
set.add(null);  
set.add(1);  //--->Line indicated by exception  

次の例外を与えますか?

スレッド「メイン」での例外 java.lang.NullPointerException at
java.lang.Integer.compareTo(Unknown Source) at
java.lang.Integer.compareTo(Unknown Source) at
java.util.TreeMap.put(Unknown Source)
java. util.TreeSet.add(不明なソース)

4

4 に答える 4

19

はい、できます。ただし、 がセットの他のコンテンツと比較されるComparator場合に対処するには、独自のものを提供する必要があります。null自然な順序付けが適用されると、Java オブジェクトは自分自身を と比較する方法を知りませんnull。逆に、nullは呼び出すことができないため、自分自身を任意のオブジェクトと比較する方法を知りませんnull.compareTo(object)

このような「ヌルセーフ」の実装例Comparatorは、apache commons-collectionsライブラリにあります。をチェックしてくださいNullComparator。次のように使用できます。

// Unfortunately no support for Java generics yet, in commons-collections
@SuppressWarnings("unchecked")
SortedSet<Integer> set = new TreeSet<Integer>(new NullComparator());  
set.add(null);  
set.add(1);
于 2012-07-23T07:48:23.260 に答える
6

TreeSet の API ( http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html#add(E) ) は、add が NPE をスローすると述べています。

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

したがって、null を保存する場合は、これを処理できる Comparator を提供する必要があります。これは、null が 0 または他のすべての値と比較してどこにあるかを知っています。

于 2012-07-23T07:49:29.420 に答える
2

Comparator を作成する代わりに、独自の「null」値を作成できます。

static final Integer NULL = Integer.MIN_VALUE;

set.add(NULL):
于 2012-07-23T07:50:16.343 に答える