192 votes

Vérification nulle dans une boucle for améliorée

Quel est le meilleur moyen de se protéger 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 pourrait ne pas y avoir d'autre moyen. Devraient-ils l'avoir mis dans la construction for elle-même, si elle est nulle alors ne lancez pas la boucle?

245voto

OscarRyz Points 82553

Vous devriez mieux vérifier d'où vous tirez 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:

 for( Object o : safe( list ) ) {
   // do whatever 
 }
 

Et bien sûr, safe serait:

 public static List safe( List other ) {
    return other == null ? Collections.EMPTY_LIST : other;
}
 

102voto

Jon Skeet Points 692016

Vous pourriez potentiellement écrire une méthode d'assistance qui renvoyait une séquence vide si vous passiez à null:

 public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}
 

Alors utilisez:

 for (Object object : emptyIfNull(someList)) {
}
 

Je ne pense toutefois pas que je ferais cela - j’utiliserais généralement votre deuxième formulaire. En particulier, le "ou le lancer de l'ex" est important - s'il ne devrait pas être nul, vous devriez absolument lancer une exception. Vous savez que quelque chose a mal tourné, mais vous ne connaissez pas l'étendue des dégâts. Abandonner tôt.

8voto

Lombo Points 2764

Si vous êtes arriver qu' List d'un appel de la méthode que vous mettre en œuvre, il n'y a pas de retour null, de retour d'un vide List.

Si vous ne pouvez pas changer la mise en œuvre puis vous êtes coincé avec le null vérifier. Si il doit pas être null, puis de lever une exception.

Je ne voudrais pas passer pour la méthode d'assistance qui retourne une liste vide, car il peut être utile, à certains moments, mais alors, vous obtiendrez l'habitude de l'appeler, dans chaque boucle de vous faire éventuellement cacher quelques bugs.

1voto

Nico de Wet Points 51

Une autre façon de se prémunir efficacement contre une valeur nulle dans une boucle for consiste à envelopper votre collection avec les Optional<T> Google Guava, car cela, espère-t-on, permet de clarifier la possibilité d'une collection réellement vide, car le client devrait vérifier si la collection est présente avec Optional.isPresent() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X