Was ist der beste Weg, um in einer for-Schleife in Java gegen Null zu schützen?
Das scheint 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 könnte keinen anderen Weg geben. Sollten sie es in das for
Konstrukt selbst eingefügt haben , wenn es null ist, dann führen Sie die Schleife nicht aus?
null
ist nicht dasselbe wie eine leere Sammlung.Antworten:
Sie sollten besser überprüfen, woher Sie diese Liste beziehen.
Eine leere Liste ist alles, was Sie brauchen, 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:
Und natürlich
safe
wäre:quelle
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/… gut ist. Was ist IIRC?Sie könnten möglicherweise eine Hilfsmethode schreiben, die eine leere Sequenz zurückgibt, wenn Sie null übergeben:
Dann benutze:
Ich glaube nicht, dass ich das tatsächlich tun würde - normalerweise würde ich Ihre zweite Form verwenden. Insbesondere das "oder throw ex" ist wichtig - wenn es wirklich nicht null sein sollte, sollten Sie definitiv eine Ausnahme auslösen. Sie wissen, dass etwas schief gelaufen ist, aber Sie kennen das Ausmaß des Schadens nicht. Früh abbrechen.
quelle
emptyIfNull
lautetIterable<T>
- es gibt die unglücklicheremove
MethodeIterator<T>
, aber das ist der einzige veränderbare Aspekt davon (und wenn Sie eine leere Sammlung haben, warum versuchen Sie, etwas daraus zu entfernen?) Es ist nicht klar, was Sie tun. Ich widerspreche hier.Es ist bereits 2017 und Sie können jetzt Apache Commons Collections4 verwenden
Die Verwendung:
Sie können dieselbe null-sichere Prüfung auch für andere Collection-Klassen mit durchführen
CollectionUtils.emptyIfNull
.quelle
Collections.emptyList()
intern, was wiederum immer dieselbe vorab zugewiesene leere, nicht änderbare Liste zurückgibt.Mit Java 8
Optional
:quelle
someList != null ? someList : Collections.emptyList()
und erstellt und wirft sofort eineOptional
Objektinstanz weg .Verwendung
ArrayUtils.nullToEmpty
aus dercommons-lang
Bibliothek für ArraysDiese Funktionalität ist in der
commons-lang
Bibliothek vorhanden, die in den meisten Java-Projekten enthalten ist.Dies ist die gleiche Antwort wie die Antwort von @OscarRyz, aber um des DRY- Mantras willen halte ich es für erwähnenswert. Siehe die Projektseite commons-lang . Hier ist die
nullToEmpty
API- Dokumentation und QuelleMaven-Eintrag, der
commons-lang
in Ihr Projekt aufgenommen werden soll, falls dies noch nicht geschehen ist.Bietet
commons-lang
diese Funktionalität leider nicht fürList
Typen. In diesem Fall müssten Sie eine Hilfsmethode wie zuvor erwähnt verwenden.quelle
Wenn Sie dies
List
von einem von Ihnen implementierten Methodenaufruf erhalten, geben Sie nicht zurücknull
, sondern geben Sie ein leeres zurückList
.Wenn Sie die Implementierung nicht ändern können, bleiben Sie bei der
null
Prüfung. Wenn dies nicht der Fall sein solltenull
, wird eine Ausnahme ausgelöst .Ich würde mich nicht für die Hilfsmethode entscheiden, die eine leere Liste zurückgibt, da 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.
quelle
Ich habe die obige Antwort geändert, sodass Sie nicht von Object aus wirken müssen
und rufen Sie dann einfach die Liste auf
Erklärung: MyOwnObject: Wenn
List<Integer>
dann, ist MyOwnObject in diesem Fall Integer.quelle
Eine andere Möglichkeit, sich effektiv gegen eine Null in einer for-Schleife zu schützen, besteht darin, Ihre Sammlung mit Google Guava zu verpacken,
Optional<T>
da dies hoffentlich die Möglichkeit einer effektiv leeren Sammlung verdeutlicht, da vom Kunden erwartet wird, dass er prüft, ob die Sammlung vorhanden istOptional.isPresent()
.quelle
Für alle, die nicht daran interessiert sind, ihre eigene statische Null-Sicherheitsmethode zu schreiben, können Sie Folgendes verwenden: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Beispielsweise:ObjectUtils.defaultIfNull JavaDoc
quelle
Verwenden Sie eine Nullsichere
CollectionUtils.isEmpty(Collection coll)
Methode, um zu überprüfen, ob die angegebene Sammlung leer ist.dafür
import org.apache.commons.collections.CollectionUtils
.Maven-Abhängigkeit
quelle
quelle