Quelle est la meilleure façon de se prémunir contre null dans une boucle for en Java?
Cela semble moche:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
Ou
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
Il n'y a peut-être pas d'autre moyen. Auraient-ils dû le mettre dans la for
construction elle-même, s'il est nul, alors ne lancez pas la boucle?
null
n'est pas la même chose qu'une collection vide.Réponses:
Vous devriez mieux vérifier d'où vous obtenez cette liste.
Une liste vide est tout ce dont vous avez besoin, car une liste vide n'échouera pas.
Si vous obtenez cette liste ailleurs et que vous ne savez pas si c'est correct ou non, vous pouvez créer une méthode utilitaire et l'utiliser comme ceci:
Et bien sûr
safe
serait:la source
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/ ... Qu'est-ce que l'IIRC?Vous pourriez potentiellement écrire une méthode d'assistance qui retournait une séquence vide si vous passiez null:
Puis utilisez:
Je ne pense pas que je le ferais réellement - j'utiliserais généralement votre deuxième formulaire. En particulier, le "or throw ex" est important - s'il ne doit vraiment pas être nul, vous devez absolument lancer une exception. Vous savez que quelque chose ne va pas, mais vous ne connaissez pas l'étendue des dégâts. Abandonnez tôt.
la source
emptyIfNull
estIterable<T>
- il y a laremove
méthode malheureuseIterator<T>
, mais c'est le seul aspect modifiable de celui-ci (et si vous avez une collection vide, pourquoi essayez-vous d'en supprimer quoi que ce soit?) Ce n'est pas clair ce que vous '' vous vous opposez ici.Nous sommes déjà en 2017 et vous pouvez désormais utiliser Apache Commons Collections4
L'usage:
Vous pouvez effectuer la même vérification de sécurité nulle sur d'autres classes Collection avec
CollectionUtils.emptyIfNull
.la source
Collections.emptyList()
interne, qui à son tour renvoie toujours la même liste vide non modifiable préallouée.Avec Java 8
Optional
:la source
someList != null ? someList : Collections.emptyList()
et crée également et jette immédiatement une instance d'Optional
objet.Utilisation à
ArrayUtils.nullToEmpty
partir de lacommons-lang
bibliothèque pour les tableauxCette fonctionnalité existe dans la
commons-lang
bibliothèque, qui est incluse dans la plupart des projets Java.C'est la même chose que la réponse donnée par @OscarRyz, mais pour le bien du mantra DRY , je pense que cela vaut la peine de le noter. Voir la page du projet commons-lang . Voici la documentation de l'
nullToEmpty
API et la source deEntrée Maven à inclure
commons-lang
dans votre projet si ce n'est déjà fait.Malheureusement,
commons-lang
ne fournit pas cette fonctionnalité pour lesList
types. Dans ce cas, vous devrez utiliser une méthode d'assistance comme mentionné précédemment.la source
Si vous obtenez cela à
List
partir d'un appel de méthode que vous implémentez, ne retournez pasnull
, retournez unList
.Si vous ne pouvez pas modifier l'implémentation, vous êtes coincé avec le
null
chèque. Si ça ne devrait pas êtrenull
, lancez une exception.Je n'irais pas pour la méthode d'assistance qui renvoie une liste vide car elle peut être utile parfois, mais vous vous habitueriez à l'appeler dans chaque boucle que vous faites en cachant éventuellement des bogues.
la source
J'ai modifié la réponse ci-dessus, vous n'avez donc pas besoin de lancer depuis Object
puis appelez simplement la liste par
Explication: MyOwnObject: If
List<Integer>
then MyOwnObject sera Integer dans ce cas.la source
Une autre façon de se prémunir efficacement contre un null dans une boucle for consiste à envelopper votre collection avec Google Guava
Optional<T>
car cela, on l'espère, rend la possibilité d'une collection effectivement vide claire puisque le client devrait vérifier si la collection est présente avecOptional.isPresent()
.la source
Pour quiconque n'est pas intéressé par l'écriture de sa propre méthode de sécurité nulle statique, vous pouvez utiliser: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Par exemple:ObjectUtils.defaultIfNull JavaDoc
la source
Utilisez,
CollectionUtils.isEmpty(Collection coll)
méthode qui est Null-safe vérifie si la collection spécifiée est vide.pour cela
import org.apache.commons.collections.CollectionUtils
.Dépendance Maven
la source
la source