Nullprüfung in einer erweiterten for-Schleife

Lesezeit: 6 Minuten

Was ist der beste Weg, um sich in einer for-Schleife in Java vor Null zu schützen?

Das sieht hässlich aus:

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

Oder

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

Es gibt vielleicht keinen anderen Weg. Hätten sie es in die stecken sollen for sich selbst konstruieren, wenn es null ist, dann die Schleife nicht ausführen?

  • Sie sind wahrscheinlich besser dran, eine NPE zu werfen. null ist nicht dasselbe wie eine leere Sammlung.

    – Tom Hawtin – Angelleine

    12. Februar 2010 um 8:35 Uhr

  • @GregMattes Wie ist die Februar-Frage ein Duplikat der Oktober-Frage?

    – Val

    9. September 2013 um 8:47 Uhr

  • Sie müssen nur Collections.nonNullElementsIn(…) verwenden: stackoverflow.com/a/34913556/5637185

    – Jeffrey Dilley

    21. Januar 2016 um 1:00 Uhr

Benutzer-Avatar
OscarRyz

Sie sollten besser überprüfen, woher Sie diese Liste bekommen.

Eine leere Liste ist alles, was Sie brauchen, denn eine leere Liste wird nicht scheitern.

Wenn Sie diese Liste von woanders bekommen und nicht wissen, ob sie in Ordnung ist oder nicht, können Sie eine Utility-Methode erstellen und sie wie folgt verwenden:

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

Und natürlich safe wäre:

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

  • Beachten Sie, dass Collections.emptyList() die Zuweisung eines zusätzlichen Objekts (IIRC) vermeidet.

    – Jon Skeet

    12. Februar 2010 um 6:31 Uhr

  • @Jon: Ich habe mich immer gefragt, was das bringt emptyList java.sun.com/j2se/1.5.0/docs/api/java/util/… Was ist IIRC?

    – Oscar Ryz

    12. Februar 2010 um 6:34 Uhr

  • IIRC = “Wenn ich mich richtig erinnere”. Und ja, es gibt eine Singleton-Instanz, die für alle Aufrufe von Collections.emptyList() zurückgegeben wird.

    – ColinD

    12. Februar 2010 um 6:40 Uhr

  • Dies … beantwortet die Frage nicht wirklich. Warum ist es akzeptierte Antwort?

    – Christoph Wirt

    30. April 2015 um 21:34 Uhr

  • @ChristopherWirt, weil es die Frage beantwortet: D

    – Tarik

    29. Dezember 2015 um 15:16 Uhr

Benutzer-Avatar
Jon Skeet

Sie könnten möglicherweise eine Hilfsmethode schreiben, die eine leere Sequenz zurückgibt, wenn Sie null übergeben:

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 aber nicht, dass ich das tatsächlich tun würde – normalerweise würde ich Ihre zweite Form verwenden. Insbesondere das „or throw ex“ ist wichtig – wenn es wirklich nicht null sein soll, sollte man unbedingt eine Exception werfen. Du weißt, dass etwas schief gelaufen ist, aber Sie kennen das Ausmaß des Schadens nicht. vorzeitig abbrechen.

  • Ich würde den Listenparameter Iterable in Iterable iterable ändern, da nicht jede iterierbare Liste eine Liste ist.

    – Lombos

    12. Februar 2010 um 6:35 Uhr

  • Seien Sie vorsichtig bei der Verwendung dieser Methode: Aufgrund der Verwendung der Collections-Klasse beinhaltet die Verwendung dieser Methode, dass Ihre Liste unveränderlich ist

    – Tanorix

    26. April 2017 um 16:34 Uhr

  • @tanorix: Auf welche Weise?

    – Jon Skeet

    26. April 2017 um 16:42 Uhr

  • @JonSkeet Sie können sehen, dass emptyList() der Collections-Klasse eine unveränderliche Liste zurückgibt: docs.oracle.com/javase/8/docs/api/java/util/… Wenn der Benutzer also nicht möchte, dass seine Liste unveränderlich ist, kann dies problematisch sein

    – Tanorix

    27. April 2017 um 9:14 Uhr


  • @tanorix: Aber der Punkt dieser Frage ist ungefähr Iteration über dem zurückgegebenen Wert. Das ändert es nicht. Deshalb ist der Rückgabetyp von emptyIfNull ist Iterable<T> – Da ist das Unglück remove Methode an Iterator<T>aber das ist der einzige veränderliche Aspekt davon (und wenn Sie eine leere Sammlung haben, warum versuchen Sie dann, etwas daraus zu entfernen?) Es ist nicht klar, wogegen Sie hier Einwände erheben.

    – Jon Skeet

    27. April 2017 um 9:28 Uhr

Es ist bereits 2017, und Sie können jetzt verwenden Apache Commons-Sammlungen4

Die Verwendung:

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

Sie können die gleiche nullsichere Prüfung mit anderen Collection-Klassen durchführen CollectionUtils.emptyIfNull.

  • Wird funktionieren, erstellt jedoch ein unnötiges Listenobjekt. Eine CollectionUtils.ifNotEmpty ist möglicherweise ausführlicher, aber effizienter und schneller. Nicht, dass es viel ausmachen würde…

    – Laurentius

    29. August 2017 um 10:07 Uhr

  • 2017 würde ich List.emptyIfNull(list1) erwarten

    – Dima

    4. Dezember 2017 um 20:37 Uhr

  • @Lawrence, die Methode erstellt keine neuen Listenobjekte, sie verwendet Collections.emptyList() intern, was wiederum immer dieselbe vorbelegte leere unveränderbare Liste zurückgibt.

    – Yoory N.

    27. Februar 2018 um 6:33 Uhr

  • Was ist, wenn Sie myobject.getCompanies().getAddresses() aufrufen und beide eine Liste zurückgeben und beide null sein können?

    – Pulver366

    28. Juni 2020 um 13:42 Uhr

Mit Java8 Optional:

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

Benutzer-Avatar
sdc

Verwenden ArrayUtils.nullToEmpty von dem commons-lang Bibliothek für Arrays

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

Diese Funktionalität existiert in der commons-lang Bibliothek, 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 die Antwort von @OscarRyz, aber aus Gründen der TROCKEN Mantra, ich glaube, es ist erwähnenswert. Siehe die commons-lang Projektseite. Hier ist der nullToEmpty API Dokumentation und Quelle

Einzuschließender Maven-Eintrag commons-lang in Ihrem Projekt, falls dies noch nicht geschehen ist.

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

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

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

Benutzer-Avatar
Lombo

Wenn du das bekommst List von einem Methodenaufruf, den Sie implementieren, dann nicht zurückkehren nullgeben Sie ein leeres zurück List.

Wenn Sie die Implementierung nicht ändern können, bleiben Sie bei der stecken null überprüfen. Wenn es nicht sein sollte nullund lösen Sie dann eine Ausnahme aus.

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

Ich habe die obige Antwort geändert, sodass Sie nicht von Object umwandeln 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 per auf

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

Erläuterung: MyOwnObject: Wenn List<Integer> dann ist MyOwnObject in diesem Fall Integer.

1353590cookie-checkNullprüfung in einer erweiterten for-Schleife

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy