web-dev-qa-db-fra.com

Ces ensembles permettent null. Pourquoi ne puis-je pas ajouter d'éléments nuls?

Je veux savoir pourquoi l'implémentation de HashSet, LinkedHashSet et TreeSet n'autorise pas les éléments NULL?.

public static void main(String[] args) {

    HashSet<Integer> hashSet = new HashSet<Integer>();

    hashSet.add(2);
    hashSet.add(5);
    hashSet.add(1);
//  hashSet.add(null);  will throw null pointer 
    hashSet.add(999);
    hashSet.add(10);
    hashSet.add(10);
    hashSet.add(11);
    hashSet.add(9);
    hashSet.add(10);
    hashSet.add(000);
    hashSet.add(999);
    hashSet.add(0);

    Iterator<Integer> it = hashSet.iterator();
    while(it.hasNext()){
        int i = it.next();
        System.out.print(i+" ");
    }
    }

Guidez-moi s'il-vous-plaît.

23
nakul

C'est pourquoi je n'aime pas utiliser la boxe automatique. Les collections Java ne peuvent pas stocker de primitives (pour cela, vous aurez besoin d'une API tierce telle que Trove ). Donc, vraiment, quand vous exécutez du code comme ceci:

hashSet.add(2);
hashSet.add(5);

Ce qui se passe réellement est:

hashSet.add(new Integer(2));
hashSet.add(new Integer(5));

Ajouter un null à l'ensemble de hachage est non le problème, cette partie fonctionne très bien. Votre NPE vient plus tard, lorsque vous essayez de décompresser vos valeurs dans une primitive int:

while(it.hasNext()){
    int i = it.next();
    System.out.print(i+" ");
}

Lorsque la valeur null est rencontrée, la machine virtuelle Java tente de la décompresser dans une primitive int, ce qui conduit à un NPE. Vous devriez changer votre code pour éviter ceci:

while(it.hasNext()){
    final Integer i = it.next();
    System.out.print(i+" ");
}
51
Perception

Non, Set Interface autorise la valeur NULL seule sa mise en oeuvre, à savoir TreeSet, n'autorise pas la valeur NULL.

même si vous n'avez pas écrit de code d'itération et que vous n'avez que oTreeSet.add(null) dans votre code, celui-ci est compilé et à à l'exécution, il renvoie NullPointerException.

La méthode add() de la classe TreeSet appelle en interne la méthode put() de la classe TreeMap .null valeur n'est pas autorisée comme le code ci-dessous dans la méthode put ()

if (key == null)
     throw new NullPointerException();
6
Shrikant Dande

Set Interface n'autorise pas la valeur null, car dans TreeSet, l'élément est stocké dans l'ordre de tri afin que chaque fois que nous ajoutons un nouvel élément, il compare la valeur et le tri s'effectue. donc ce qui se passe en interne compare la nouvelle valeur Null ajoutée aux valeurs existantes, de sorte qu’elle lève NullPointerException.

String str=null;
if(str.equals("abc"))
{
}
//it will throw null pointer exception

C'est pourquoi il n'autorise pas les valeurs NULL.

4
Sajid Patel

Le point de l'interface Set est d'utiliser des informations sur les éléments (codes de hachage ou comparaisons) pour accélérer la mise en œuvre.

null n'a pas cette information.

4
SLaks

Set permet d'ajouter null pour que ce ne soit pas un problème. Deuxièmement, le programme Java doit d'abord être compilé pour le convertir en code octet, puis il est exécuté. NullPointerException est une exception levée pendant l'exécution. Le temps de compilation ne devrait pas être un problème. Voyons maintenant pourquoi vous obtenez NPE. 

Iterator ici est supposé générer l'objet de type Integer et nous souhaitons stocker le résultat dans la variable primitive type int. Integer est une classe qui peut avoir les références de son type pour référencer à null mais les primitives ne peuvent pas contenir de valeurs nulles. 

Iterator<Integer> it = hashSet.iterator(); // Iterator of Type Integer
while(it.hasNext()){
    int i = it.next(); // it.next outputs Integer, but result is tried to be held in a primitive type variable
    System.out.print(i+" ");
}

Lorsqueint i = it.next();est exécuté, alors public int intValue() est appelé pour convertir l'objet of Integer en primitive int. Lorsque it.next() renvoie la valeur null, lanull.intValue()est exécutée, ce qui entraîne NullPointerException

si Integer est utilisé à la place de int, il n'y aura pas d'exception 

Integer i = it.next();
1
nits.kk

Seulement TreeSet aura le temps d'exécution Null pointer Exception et HashSet n'aura aucune erreur au moment de la compilation, et le temps d'exécution n'autorisera qu'une valeur null. Si nous entrons plus que cela, cela passera dans HashSet. Vois ici:

public class HasSetDemo {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //no error it will print only one null and 2,5,8
        Set<Integer> s = new HashSet<Integer>();
        s.add(2);
        s.add(5);
        s.add(8);
        s.add(null);
        s.add(null);//it will override and hashset will allow one null value
        Iterator i=s.iterator();        
        while(i.hasNext()){
            Object in=(Object)i.next();
            System.out.println(" hi "+in);
        }
    }
}

Les sorties

hi null
hi 2
hi 5
hi 8

Cas 2:

public class SetDemo {

    public static void main(String[] args) {
        // either its may be string or integer it will give NullPointerException in run time
        Set<String> s2 = new TreeSet<>();
        s2.add("ramana");
        s2.add(null);
        s2.add("4");
        s2.add("5");
        s2.add(null);
        Iterator<String> i=s2.iterator();       
        while(i.hasNext()){
            System.out.println(i.next());
        }
    }
}

Les sorties:

Exception in thread "main" Java.lang.NullPointerException
    at Java.util.TreeMap.put(Unknown Source)
    at Java.util.TreeSet.add(Unknown Source)
    at com.sagili.set.SetDemo.main(SetDemo.Java:13)
0
Sagili Ramanareddy
public class JavaHashSetTest {


    public static void main(String[] args) {
        Set<Integer> hashset= new HashSet<Integer>();

        hashset.add(null);
        hashset.add(22);
        hashset.add(222);
        hashset.add(null);
        hashset.add(11);
        hashset.add(233);
        //  TreeSet<String> tset=hashset;

      Iterator<Integer> it = hashset.iterator();
        while(it.hasNext()){
            Integer i = it.next();
            System.out.print(i+" ");
        }
    }

}

Mon code fonctionne et pourquoi il vous donnera Nullpointer J'ai essayé de trier hashset qui contient la valeur Null, il vous donnera une exception, sinon cela fonctionnera bien.

0
user4948462