wake-up-neo.net

Nullprüfung in einer erweiterten for-Schleife

Was ist der beste Weg, um in einer for-Schleife in Java gegen null zu schützen? 

Das erscheint hässlich:

if (someList != null) {
    for (Object object : someList) {
        // do whatever
    }
}

Oder

if (someList == null) {
    return; // Or throw ex
}
for (Object object : someList) {
    // do whatever
}

Es kann keinen anderen Weg geben. Sollten sie es in das for-Konstrukt selbst eingefügt haben, wenn es null ist, dann nicht die Schleife ausführen?

154
fastcodejava

Sie sollten besser überprüfen, wo Sie diese Liste erhalten. 

Sie brauchen nur eine leere Liste, da eine leere Liste nicht fehlschlägt.

Wenn Sie diese Liste von einem anderen Ort erhalten und nicht wissen, ob sie in Ordnung ist oder nicht, können Sie eine Dienstprogrammmethode erstellen und wie folgt verwenden:

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

Und safe wäre natürlich:

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

Sie könnten möglicherweise eine Hilfsmethode schreiben, die eine leere Sequenz zurückgegeben hat, wenn Sie in null übergeben haben:

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

Dann benutze:

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

Ich glaube nicht, dass ich das tatsächlich tun würde - normalerweise würde ich das zweite Formular verwenden. Insbesondere das "or throw ex" ist wichtig - wenn es wirklich nicht null sein sollte, sollten Sie auf jeden Fall eine Ausnahme auslösen. Sie wissen, dass etwas falsch gelaufen ist, aber Sie wissen nicht, wie groß der Schaden ist. Abbruch früh.

91
Jon Skeet

Es ist bereits 2017, und Sie können jetzt Apache Commons Collections4 verwenden.

Die Verwendung:

for(Object obj : ListUtils.emptyIfNull(list1)){
    // Do your stuff
}

Sie können dieselbe nullsichere Prüfung auch für andere Collection-Klassen mit CollectionUtils.emptyIfNull durchführen.

23
Fred Pym

Wenn Sie diese List von einem Methodenaufruf erhalten, den Sie implementieren, geben Sie null nicht zurück, sondern geben Sie eine leere List zurück.

Wenn Sie die Implementierung nicht ändern können, bleiben Sie bei der null-Prüfung. Wenn es nicht null sein soll, dann wird eine Ausnahme ausgelöst.

Ich würde nicht für die Hilfsmethode gehen, die eine leere Liste zurückgibt, weil sie manchmal nützlich sein kann, aber dann würden Sie sich daran gewöhnen, sie in jeder Schleife aufzurufen, die Sie möglicherweise machen, um möglicherweise einige Fehler zu verbergen.

7
Lombo

Verwenden Sie ArrayUtils.nullToEmpty aus der commons-lang-Bibliothek für Arrays

for( Object o : ArrayUtils.nullToEmpty(list) ) {
   // do whatever 
}

Diese Funktionalität ist in der commons-lang-Bibliothek enthalten, die in den meisten Java-Projekten enthalten ist.

// ArrayUtils.nullToEmpty source code 
public static Object[] nullToEmpty(final Object[] array) {
    if (isEmpty(array)) {
        return EMPTY_OBJECT_ARRAY;
    }
    return array;
}

// ArrayUtils.isEmpty source code
public static boolean isEmpty(final Object[] array) {
    return array == null || array.length == 0;
}

Dies ist die gleiche wie in der Antwort von @OscarRyz, aber für das DRY Mantra halte ich es für erwähnenswert. Siehe die commons-lang Projektseite. Hier ist die nullToEmpty API Dokumentation und Quelle

Maven-Eintrag, um commons-lang in Ihr Projekt aufzunehmen, falls noch nicht geschehen. 

<dependency>
    <groupId>org.Apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

Leider bietet commons-lang diese Funktionalität nicht für List-Typen. In diesem Fall müssten Sie, wie bereits erwähnt, eine Hilfsmethode verwenden.

public static <E> List<E> nullToEmpty(List<E> list)
{
    if(list == null || list.isEmpty())
    {
        return Collections.emptyList();
    }
    return list;
}
7
sdc

Mit Java 8 Optional:

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
    // do whatever
}
6
holmis83

Ich habe die obige Antwort geändert, sodass Sie nicht von Object aus wirken müssen

public static <T> List<T> safeClient( List<T> other ) {
            return other == null ? Collections.EMPTY_LIST : other;
}

und rufen Sie dann einfach die Liste mit auf

for (MyOwnObject ownObject : safeClient(someList)) {
    // do whatever
}

Erklärung: MyOwnObject: Wenn List<Integer>, dann ist MyOwnObject in diesem Fall Integer.

3
Haris Iltifat

Für alle, die sich nicht für die Erstellung ihrer eigenen statischen Null-Sicherheitsmethode interessieren, können Sie Folgendes verwenden: commons-lang's org.Apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object). Zum Beispiel: 

    for (final String item : 
    (List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }

ObjectUtils.defaultIfNull JavaDoc

1
Jacob Briscoe

Eine andere Möglichkeit, sich effektiv gegen eine Null in einer for-Schleife zu schützen, besteht darin, Ihre Sammlung mit Google Guavas Optional<T> zu umhüllen, da dies hoffentlich die Möglichkeit einer effektiv leeren Sammlung deutlich macht, da der Client die Überprüfung der Daten erwartet Sammlung ist bei Optional.isPresent() vorhanden.

1
Nico de Wet

Verwenden Sie die CollectionUtils.isEmpty(Collection coll)-Methode, bei der es sich um eine nullsichere Prüfung handelt, wenn die angegebene Sammlung leer ist. 

für diesen import org.Apache.commons.collections.CollectionUtils.

Maven-Abhängigkeit

<dependency>
    <groupId>org.Apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>
0
Swadeshi