7
votes

Existe-t-il des classes de collection Java natif qui prolongent la liste qui n'autorisent pas les éléments nuls?

Selon le Documentation , List.Contains Peut lancer NullpointException dans ce scénario:

"Si l'élément spécifié est null et Cette liste ne supporte pas NULL éléments (facultatif). "

J'essayais simplement de penser à une mise en œuvre de la liste qui ne permet pas à NULLS cependant, et je ne suis au courant d'aucun. Par exemple, je peux avoir arraylist , mais cela permet aux nulls. xxx

est donc la documentation ici faisant référence à des implémentations personnalisées de cette interface ou existe-t-il des classes de collection Java natif qui étendent qui n'autorisent pas les éléments null? Je réalise que l'exception est facultative, j'essayais simplement de penser à un cas réel mondial où cela pourrait se produire.


0 commentaires

5 Réponses :


5
votes

Cela fait référence à des implémentations personnalisées, jusqu'au jour où l'une des implémentations de la liste de Java désactive NULL, puis il conviendra également de cela.


0 commentaires

1
votes

--- post modifié en réponse aux commentaires ---

Fondamentalement la raison pour laquelle il est illégal de vous rappeler d'attraper le nullpointexcepton car les concepteurs de la liste interface envisagée des listes envisagées pouvant signaler tout null accès comme une erreur.

--- Le message original suit ---

Ceux fournis par les bibliothèques java standard prennent en charge NULL, mais il n'y a aucune restriction à la création d'une classe qui implémente java.util.list qui ne prend pas en charge null s.

Si la liste ne prend pas en charge null , alors recherchez un null est équivalent à une erreur. L'exception peut donc avoir un sens en fonction de l'OMS implémentée le Liste . C'est pourquoi l'interface doit mentionner l'exception vérifiée; Parce que, si ce n'est pas le cas, vous ne pouvez pas lancer un nullpointerexception de la sous-classe, vous avez voulu vous assurer que personne n'a touché la liste avec un null .


5 commentaires

En fait, depuis que la NPE est une exception à la runtimédia, il n'est pas nécessaire de le déclarer dans la signature de la méthode (si c'était à peu près tout ce qui l'aurait, car c'est une exception aussi commune). Plus susceptiment qu'ils disent qu'ils veulent soutenir des listes qui ne permettent pas NULLS, et que si vous vérifiez s'il contient une valeur null, elle jettera cette exception intentionnellement, par opposition à tous les cas d'exécution dans lesquels cela pourrait arriver comme essayer d'accéder aux propriétés d'une instance NULL, lorsque le VM le jette pour vous.


On dirait que vous disiez la même chose d'abord, mais il semble que la raison principale qu'il soit là qu'il est là de vous rappeler que vous devez vérifier le NPE, car tout code spécifique de la liste est plus susceptible de lancer la NPE (en raison de la mise en œuvre).


Ou éventuellement, ils essaient de couvrir les développeurs qui pourraient essayer de faire obj.equals sur l'argument adopté dans leur mise en œuvre de la liste sans vérifier si c'est NULL, et finira par donner une NPE sans qu'ils se rendent compte . :)


Vrai, mais compte tenu d'une telle "fonctionnalité" serait considérée comme un bug de la plupart, je ne pense pas qu'ils essayaient d'activer la faible assainissement des données sur les intrants de la collecte.


Plain et simple, les personnes qui ont développé cette API ne veulent pas que vous attrapiez une NPE. Comme l'a dit Andrei, ils couvrent tous les développeurs. Josh Bloch (OMS architectes dans le cadre de collections) respecte le principe du moins d'étonnement. Le commentaire explique cela.



5
votes

Toutes les implémentations de la liste <...> permettent aux éléments d'être nuls.

Un exemple est Rolelist :: ajout (rôle) qui jette une exception lors de l'ajout d'une valeur null.

Cette documentation vous prépare à une telle rencontre, vous encourage à vérifier la documentation de la liste des tâches que vous travaillez pour voir si c'est une préoccupation, ou de vous tromper du côté de la prudence si vous ne pouvez pas le vérifier. Suivi de NPE's n'est pas amusant. Connaissant la documentation (à condition que la bonne documentation existe) peut économiser beaucoup de maux de tête.


2 commentaires

Merci pour la réponse et l'exemple. Merci à tous les autres pour leurs réponses aussi, ils étaient utiles, j'ai juste aimé la façon dont cette réponse a expliqué succinctement les choses.


Ironiquement, il ne jette pas un nullpointexception mais un illegalargumentException . Mais le point reste: c'est un rappel que vous ne pouvez pas supposer que NULL est autorisé dans.



2
votes

GUAVA 'S immutableliste désalcule null, mais il renvoie false sur contient (null) .


1 commentaires

Intéressant. Donc, immutateset . Mais des cartes créées par MapMaker Lancer un NullPointerException ON CONTACTKEY (NULL)



1
votes

a CheckedList serait un exemple de liste dans l'API standard qui ne prend pas en charge les NULLS.


0 commentaires