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?
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;
}
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.
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.
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.
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;
}
Mit Java 8 Optional
:
for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
// do whatever
}
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.
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())) { ... }
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.
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>