Vermeiden! = Null-Anweisungen
Benutze ich object != null
eine Menge zu vermeiden NullPointerException
.
Ist es eine gute alternative zu dieser?
Beispiel:
if (someobject != null) {
someobject.doCalc();
}
Dadurch wird vermieden, dass NullPointerException
wenn es unbekannt ist, wenn das Objekt null
oder nicht.
Beachten Sie, dass die akzeptierten Antworten können veraltet sein, siehe https://stackoverflow.com/a/2386013/12943 einen neueren Ansatz.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese für mich klingt wie ein einigermaßen verbreitetes problem, das junior-intermediate-Entwickler dazu neigen zu Gesicht, an einem gewissen Punkt: Sie sind entweder nicht wissen, oder Vertrauen Sie nicht auf die Verträge, die Sie beteiligt sind und defensiv overcheck für null-Werte. Darüber hinaus, wenn Sie Ihren eigenen code schreiben, Sie verlassen sich auf die RÜCKFÜHRUNG von null, um anzuzeigen, etwas, so dass der Anrufer-check für null-Werte.
Setzen einen anderen Weg, es gibt zwei Fälle, in denen null-Prüfung kommt:
Wo null ist eine gültige Antwort in Bezug auf den Vertrag; und
Wo es nicht eine gültige Antwort.
(2) ist einfach. Entweder
assert
Aussagen (assertions) oder erlauben Fehler (zum Beispiel, NullPointerException). Behauptungen sind eine sehr wenig genutzte Java-Funktion, die Hinzugefügt wurde, die in 1.4. Die syntax ist:oder
wo
<condition>
ist ein boolescher Ausdruck, und der<object>
ist ein Objekt, dessentoString()
Methode die Ausgabe wird in die error.Einer
assert
- Anweisung löst eineError
(AssertionError
), wenn die Bedingung nicht wahr ist. Standardmäßig wird, ignoriert Java-assertions. Sie können Behauptungen durch übergeben der option-ea
auf der JVM. Sie können aktivieren und deaktivieren von assertions für einzelne Klassen und Pakete. Dies bedeutet, dass Sie überprüfen kann, code mit den Behauptungen, die während der Entwicklung und Erprobung, und deaktivieren Sie Sie in einer Produktionsumgebung, obwohl meine Tests gezeigt hat weiter keine Auswirkungen auf die Leistung von Behauptungen.Nicht mit Behauptungen, die in diesem Fall OK ist, weil der code einfach nur fail, das ist, was passieren wird, wenn Sie Behauptungen. Der einzige Unterschied ist, dass mit Behauptungen, es könnte früher geschehen, in die eine weitere sinnvolle Art und Weise und möglicherweise mit zusätzlichen Informationen, die Ihnen helfen können, um herauszufinden, warum es passiert ist, wenn du nicht erwartet hast.
(1) ist ein wenig härter. Wenn Sie keine Kontrolle über den code, den Sie hier aufrufen dann sind Sie stecken. Wenn der Wert null ist eine gültige Antwort, die Sie haben zu prüfen.
Wenn es der code, dass Sie die Kontrolle, allerdings (und das ist oft der Fall), dann ist es eine andere Geschichte. Vermeiden Sie die Verwendung von null-Werten als eine Antwort. Mit Methoden, die Rückkehr der Sammlungen ist es ganz einfach: Rückkehr leer Sammlungen (oder arrays) anstelle von null-Werten so ziemlich die ganze Zeit.
Mit nicht-Sammlungen könnte es schwieriger werden. Betrachten Sie dies als ein Beispiel: wenn Sie über diese Schnittstellen:
wo Parser nimmt raw user input und findet etwas zu tun, vielleicht wenn Sie Umsetzung ein command line interface für etwas. Nun könnte man den Vertrag machen, dass es null zurück, wenn keine geeigneten Maßnahmen. Führt, dass die null-überprüfen Sie reden.
Ist eine alternative Lösung niemals null zurück, und stattdessen die Null-Objekt-pattern:
Vergleichen:
zu
ist eine viel bessere design, da es führt zu kürzeren code.
Sagte, vielleicht ist es völlig angemessen für die findAction () - Methode löst eine Ausnahme mit einer bedeutungsvollen Fehlermeldung-vor allem in diesem Fall, wo Sie sich auf user-input. Es wäre viel besser für die findAction Methode eine Exception werfen, als für die aufrufende Methode zu sprengen, mit einem einfachen NullPointerException ohne Erklärung.
Oder wenn Sie denken, dass der try/catch Mechanismus ist so hässlich, anstatt Nichts Tun Sie Ihre Standard-Aktion sollte feedback für die Benutzer.
InformationsquelleAutor der Antwort
Wenn Sie verwenden (oder verwenden möchten) eine Java-IDE wie JetBrains IntelliJ IDEAEclipse oder Netbeans oder ein Tools wie findbugs, dann können Sie Anmerkungen, um dieses problem zu lösen.
Im Grunde hast du
@Nullable
und@NotNull
.Können Sie in der Methode und Parameter wie folgt:
oder
Zweiten Beispiel wird nicht kompilieren (in IntelliJ IDEA).
Wenn Sie die ersten
helloWorld()
Funktion in einem anderen Stück code:Nun die IntelliJ IDEA-compiler wird Ihnen sagen, dass die Prüfung sinnlos, da die
helloWorld()
Funktion nicht zurücknull
überhaupt.Verwenden Sie den parameter
wenn Sie so etwas schreiben:
Dieser Code wird nicht kompiliert.
Letzte Beispiel der Verwendung
@Nullable
Tun dies
- Und Sie können sicher sein, dass das nicht passieren wird. 🙂
Es ist eine nette Weise, damit den compiler-check etwas mehr als sonst und Durchsetzung Ihrer Verträge, stärker zu werden. Leider, es ist nicht unterstützt von allen Compilern.
In IntelliJ IDEA 10.5 und auf Sie Unterstützung für andere
@Nullable
@NotNull
Implementierungen.Siehe blog-post Mehr flexible und konfigurierbare @Nullable/@NotNull Anmerkungen.
InformationsquelleAutor der Antwort
Wenn null-Werte sind nicht erlaubt
Wenn Ihr Methode wird aufgerufen, extern, beginnen Sie mit etwas wie dieses:
Dann in den rest der Methode, Sie wissen, dass
object
ist nicht null.Wenn es eine interne Methode (nicht Teil einer API), die einfach nur dokumentieren, dass es nicht null sein darf, und das ist es.
Beispiel:
Jedoch, wenn Ihre Methode einfach übergibt den Wert an, und die nächste Methode geht es bei der etc. es könnte problematisch. In diesem Fall möchten Sie vielleicht zu prüfen, das argument wie oben.
Wenn der Wert null ist erlaubt
Diese wirklich hängt. Wenn Sie finden, dass ich oft etwas wie das hier tun:
Also ich Zweig, und tun, zwei völlig verschiedene Dinge. Es gibt keine hässlichen code-snippet, weil ich wirklich brauchen, um zu tun, zwei verschiedene Dinge, je nach Daten. Zum Beispiel sollte ich die Arbeit am Eingang, oder sollte ich berechnen, ein guter Standard-Wert?
Es ist eigentlich selten für mich zu verwenden die Redewendung "
if (object != null && ...
".Kann es einfacher sein, geben Sie Beispiele, wenn Sie Beispiele, wo Sie in der Regel verwenden die Redewendung.
InformationsquelleAutor der Antwort
Wow, ich fast hassen, fügen Sie eine andere Antwort, wenn wir haben 57 verschiedene Möglichkeiten zu empfehlen, die
NullObject pattern
aber ich denke, dass einige Leute daran interessiert, diese Frage kann, wie zu wissen, dass es ist ein Vorschlag auf dem Tisch für Java 7 hinzufügen "null-sicherer Umgang"—eine schlanke syntax für wenn-nicht-gleich-null-Logik.Das Beispiel von Alex Miller sieht wie folgt aus:
Den
?.
bedeutet, dass nur de-Referenz-Links-Kennung wenn es nicht null ist, sonst bewerten Sie den Rest des Ausdrucks alsnull
. Einige Leute, wie Java Posse-Mitglied Dick die Wand und das Wähler bei der Devoxx wirklich Liebe, dieser Vorschlag, aber es gibt die opposition zu, mit der Begründung, dass es tatsächlich zu ermutigen, mehr Gebrauch vonnull
als sentinel-Wert.Update: Eine offizielle Vorschlag für eine null-safe-operator in Java 7 wurde eingereicht unter Projekt-Münze. Die syntax ist ein wenig anders als im obigen Beispiel, aber es ist der gleiche Begriff.
Update: Das null-safe-operator Vorschlag schaffte es nicht in die Projekt-Münze. Also, Sie werden nicht sehen, diese syntax in Java 7.
InformationsquelleAutor der Antwort
Wenn Undefinierte Werte sind nicht zulässig:
Könnten Sie konfigurieren Ihre IDE, um Sie zu warnen, über mögliche null-Dereferenzierung. E. g. in Eclipse finden Sie Einstellungen - > Java - > Compiler > Fehler/Warnungen/Null Analyse.
Wenn Undefinierte Werte sind zulässig:
Wenn Sie wollen, definieren Sie eine neue API, wo Undefinierte Werte sinnvollverwenden Sie die Option Muster (vielleicht bekannt aus funktionalen Sprachen). Es hat die folgenden Vorteile:
Java 8 hat eine eingebaute
Optional
Klasse (empfohlen); für die früheren Versionen gibt es alternativen Bibliothek, zum Beispiel Guave'sOptional
oder FunctionalJava's- Option
. Aber wie viele funktionelle Stil-Muster, mit der Option in Java (auch 8) Ergebnisse in geraumer boilerplate, das Sie reduzieren können, mit einem weniger ausführlichen JVM-Sprache z.B. Scala oder Xtend.Wenn man mit einer API, die möglicherweise return nullSie können nicht viel in Java. Xtend und Groovy haben die Elvis-operator
?:
und die null-safe-dereference operator?.
aber beachten Sie, dass dies gibt null zurück, wenn ein null-Verweis ist, so ist es nur "verzögert" der richtige Umgang mit der null.InformationsquelleAutor der Antwort
Nur für diese situation -
Nicht überprüfen, ob eine variable null ist, bevor Sie den Aufruf einer equals-Methode (string vergleichen Sie das Beispiel unten):
wird in einem
NullPointerException
wennfoo
existiert nicht.Können Sie vermeiden, wenn Sie vergleichen Sie Ihre
String
s so:InformationsquelleAutor der Antwort
Mit Java 8 kommt die neue
java.util.Optional
Klasse, löst wohl einige das problem. Man kann zumindest sagen, dass es verbessert die Lesbarkeit des Codes, und im Fall von öffentlichen APIs der API-Vertrag klarer an die client-Entwickler.Arbeiten Sie so:
Ein optionales Objekt für einen gegebenen Typ (
Fruit
) erstellt, wie Sie den Rückgabetyp einer Methode. Es kann leer sein oder Sie enthalten eineFruit
Objekt:Schauen Sie sich jetzt diesen code, wo wir suchen, eine Liste von
Fruit
(fruits
) für einen bestimmten Obst-Instanz:Können Sie die
map()
operator zum durchführen einer Berechnung auf--oder extrahieren Sie einen Wert aus--ein optionales Objekt.orElse()
können Sie ein fallback für fehlende Werte.Natürlich, die Prüfung auf null/leer-Wert ist immer noch notwendig, aber zumindest der Entwickler ist sich bewusst, dass der Wert kann leer sein und das Risiko des Vergessens zu prüfen, ist begrenzt.
In eine API von Grund auf neu gebaut mit
Optional
wenn ein Rückgabewert kann leer sein, und die Rückgabe einer einfachen Objekt nur, wenn es nichtnull
(convention), der client-code aufgeben null prüft auf einfache Objekt Rückgabewerte...Natürlich
Optional
könnte auch verwendet werden, als eine Methode, argument, vielleicht ein besserer Weg, um optionale Argumente anzugeben, als 5 oder 10 überladen von Methoden in einigen Fällen.Optional
bietet weitere praktische Methoden, wieorElse
dass die Verwendung von einen Standard-Wert, undifPresent
funktioniert mit lambda-Ausdrücke.Ich lade Sie ein, diesen Artikel zu Lesen (meine wichtigste Quelle für das schreiben dieser Antwort), in dem die
NullPointerException
(und im Allgemeinen null-Zeiger) ebenso problematisch wie die (Teil -) Lösung gebracht, indemOptional
sind gut erklärt: Java Optionale Objekte.InformationsquelleAutor der Antwort
Je nachdem, welche Art von Objekten, die Sie überprüfen, die Sie möglicherweise in der Lage, einige der Klassen in der apache-commons wie: apache commons lang und apache commons collections
Beispiel:
oder (je nachdem, was Sie brauchen, um zu überprüfen):
Die Klasse StringUtils ist nur eine von vielen; es gibt durchaus ein paar gute Klassen in die commons, die null-sichere Handhabung.
Hier folgt ein Beispiel, wie Sie mit null-vallidation in JAVA wenn Sie mit der apache-Bibliothek(commons-lang-2.4.jar)
Und wenn Sie Frühling, der Frühling hat auch die gleiche Funktionalität in der Verpackung, siehe Bibliothek(spring-2.4.6.jar)
Beispiel zur Verwendung dieser statischen classf von Frühling(org.springframework.util.Assert)
InformationsquelleAutor der Antwort
Haben Sie zu prüfen, Objekt != null nur, wenn Sie wollen, um den Fall behandeln, wo das Objekt kann null sein...
Es ist ein Vorschlag, um neue Annotationen in Java7 zu helfen, mit null /notnull params:
http://tech.puredanger.com/java7/#jsr308
InformationsquelleAutor der Antwort
Ich bin ein fan von "fail fast" - code. Fragen Sie sich selbst - Sie tun etwas nützliches in dem Fall, wo der parameter null ist? Wenn Sie nicht haben eine klare Antwort für das, was Ihr code tun sollten, in diesem Fall... I. e. es sollte niemals null sein in den ersten Platz, dann ignorieren Sie es und ermöglichen eine NullPointerException geworfen werden. Der aufrufende code wird nur so viel Sinne einer NPE als wäre es eine IllegalArgumentException, aber es wird für Entwickler leichter zu Debuggen und zu verstehen, was falsch gelaufen ist, wenn eine NPE geworfen wird, anstatt mit dem code versuchen Sie einige andere unerwartete Kontingenz Logik - was letztlich in der Anwendung Versagen sowieso.
InformationsquelleAutor der Antwort
Manchmal, Sie haben Methoden, die auf seine Parameter definieren, dass ein symmetrischer Betrieb:
Wenn Sie wissen, b kann nie null sein, Sie können nur tauschen. Es ist besonders nützlich für gleich:
Statt
foo.equals("bar");
besser machen"bar".equals(foo);
.InformationsquelleAutor der Antwort
Den Google collections framework bietet eine gute und elegante Möglichkeit zur Erreichung der null-check.
Gibt es eine Methode in einer Bibliothek-Klasse wie folgt aus:
Und die Nutzung ist (mit
import static
):Oder in deinem Beispiel:
InformationsquelleAutor der Antwort
Eher als Null-Objekt-Pattern -- das hat auch seinen nutzen -- Sie sollten erwägen, Situationen, in denen das null-Objekt ist ein bug.
Wenn die Ausnahme ausgelöst wird, prüfen Sie die Stapel-Ablaufverfolgung, und arbeiten Sie durch den bug.
InformationsquelleAutor der Antwort
Java 7 hat eine neue
java.util.Objects
utility-Klasse, auf der es einerequireNonNull()
Methode. Alle diese tut, ist werfen einNullPointerException
wenn das argument null ist, aber es löscht den code ein wenig. Beispiel:Die Methode ist besonders nützlich für überprüfen kurz vor einer Zuweisung in einen Konstruktor, wo jeder Verwendung speichern können, drei Zeilen code:
wird
InformationsquelleAutor der Antwort
Null ist nicht ein "problem". Es ist ein integraler Teil eines komplett Modellierung-Werkzeug-set. Software soll-Modell die Komplexität der Welt und null trägt seine Last. Null bedeutet 'Keine Daten' oder 'Unbekannt' in Java und dergleichen. So ist es angebracht, die null-Werte für diese Zwecke. Ich glaube nicht, lieber die 'Null-Objekt' Muster; ich denke, es erheben sich die 'wer wird Wache
die Wächter' problem.
Wenn Sie mich Fragen, was ist der name meiner Freundin werde ich sagen, ich hätte keine Freundin. In der Java-Sprache werde ich wieder null.
Wäre eine alternative zu werfen sinnvolle Ausnahme an einige problem, die können nicht (oder wollen nicht) gelöst und delegieren Sie irgendwo im Stapel höher zu wiederholen oder Bericht Daten zugreifen Fehlermeldung an den Benutzer ausgegeben.
Für eine 'unknown' 'unknown answer". (Null-sicher ist, wo das ist richtig, aus unternehmerischer Sicht) Prüfen Argumente auf null, sobald innerhalb einer Methode vor der Benutzung entlastet mehrere Anrufer prüfen Sie vor einem Anruf.
Vorherigen führt zu normalen logic flow zu bekommen, kein Foto von einer nicht vorhandenen Freundin aus meiner Foto-Bibliothek.
Ist und es passt mit den neuen kommenden Java-API (freu)
Es ist zwar eher "normal business flow" nicht zu finden Foto, gespeichert in der DB für einige Personen, die ich verwendet, um zu verwenden Paare wie unten für einige andere Fälle
- Und nicht ungern-Typ
<alt> + <shift> + <j>
(generieren von javadoc in Eclipse) und schreiben Sie drei weitere Worte, die für Sie die öffentliche API. Dies wird mehr als genug für alle, aber diejenigen, die keine Dokumentation Lesen.oder
Diesem eher theoretischen Fall, und in den meisten Fällen sollte man lieber java null-sichere API (falls es freigegeben wird in weiteren 10 Jahren), aber
NullPointerException
ist Unterklasse einerException
. So ist es eine form derThrowable
zeigt, dass Bedingungen, die eine angemessene Anwendung zu fangen (javadoc)! Die meisten Vorteile von Ausnahmen und separaten error-handling-code von "normalen" code (laut Schöpfer von Java) es ist angebracht, als für mich, zu fangenNullPointerException
.Fragen, die entstehen könnten:
Q. Was ist, wenn
getPhotoDataSource()
null zurück?A. Es ist bis zu business-Logik. Wenn ich es nicht finde ein Fotoalbum zeige ich Euch keine Fotos. Was ist, wenn appContext ist nicht initialisiert? Diese Methode ist die business logic stellt mit diesem. Wenn die gleiche Logik sollte strenger sein, dann werfen Sie eine Ausnahme, es ist Teil der business-Logik und explizite überprüfung auf null verwendet werden soll (Fall 3). Die neue Java-Null-sichere API passt hier besser angeben selektiv, was bedeutet-und was bedeutet nicht initialisiert werden werden fail-fast-im Falle der Programmierer Fehler.
F. Redundanten code könnte ausgeführt werden und unnötig Ressourcen könnten ergriffen werden.
A. Es stattfinden könnte, wenn
getPhotoByName()
würde versuchen, eine Datenbankverbindung zu öffnen, erstellenPreparedStatement
und mit der person, die als Namen einen SQL-parameter. Der Ansatz für eine unbekannte Frage gibt eine unbekannte Antwort (Fall 1) hier funktioniert. Vor grabbing Ressourcen sollte die Methode überprüfen, Parameter und return 'unbekannt' Ergebnis, wenn nötig.F. Dieser Ansatz hat eine Leistungseinbuße aufgrund des try-Verschluss öffnen.
A. Software sollte einfach zu verstehen und ändern zunächst. Erst danach könnte man über die Leistung, und nur, wenn nötig! und, wo nötig! (Quelle), und viele andere).
PS. Dieser Ansatz wird als sinnvoll zu verwenden, da die separaten error-handling-code von "normalen" code grundsätzlich zumutbar ist, die Nutzung in irgendeinem Ort. Betrachten Sie das nächste Beispiel:
PPS. Für diejenigen, die schnell zu downvote (und nicht so schnell zur Dokumentation Lesen) möchte ich sagen, dass ich nie erwischt einen null-Zeiger-Ausnahme (NPE) in meinem Leben. Aber diese Möglichkeit war absichtlich von den Java-Machern, weil NPE ist eine Unterklasse von
Exception
. Wir haben ein Beispiel in Java-Geschichte, wennThreadDeath
ist einError
nicht, weil es tatsächlich einen Fehler in einer Anwendung, aber nur weil es nicht beabsichtigt war, gefangen zu werden! Wie viel NPE passt einError
alsThreadDeath
! Ist es aber nicht.Check für 'Keine Daten' nur, wenn die business-Logik impliziert.
und
Wenn appContext oder Datenquelle nicht initialisiert unbehandelte runtime NullPointerException töten, aktuellen thread und verarbeitet wird Thread.defaultUncaughtExceptionHandler (für Sie zu definieren, und verwenden Sie Ihre Lieblings-logger oder andere Benachrichtigung mechanizm). Wenn nicht gesetzt, ThreadGroup#uncaughtException drucken stacktrace auf system-err. Man sollte monitor application error log und öffnen Sie Jira-issue für jede nicht behandelte Ausnahme die in der Tat ist Anwendungsfehler. Programmierer sollten fix bug irgendwo in der Initialisierung Zeug.
InformationsquelleAutor der Antwort
Letztlich der einzige Weg, um vollständig zu lösen dieses problem durch Verwendung einer anderen Programmiersprache:
nil
und absolut nichts wird passieren. Dies macht die meisten null-Prüfungen nicht erforderlich, aber Sie können Fehler machen, viel schwieriger zu diagnostizieren.InformationsquelleAutor der Antwort
Gemeinsames "problem" in Java in der Tat.
Erste, meine Gedanken dazu:
Ich denke, dass es schlecht ist, zu "Essen" etwas, wenn NULL übergeben wurde, wo NULL ist kein Gültiger Wert. Wenn Sie nicht beenden die Methode mit irgendeiner Art von Fehler es bedeutet dann, dass nichts schief ging in deiner Methode, die ist nicht wahr. Dann haben Sie wahrscheinlich null zurückgeben, in diesem Fall, und in der Empfänger-Methode, die Sie wieder auf null prüfen, und es endet nie, und Sie am Ende mit "if != null", etc..
So, IMHO, muss null sein, einen kritischen Fehler, der verhindert, dass weitere Ausführung (das ist, wo die null ist kein Gültiger Wert).
Die Art, wie ich dieses problem lösen kann, ist dies:
Ersten, Folge ich dieser Konvention:
Werden und schließlich in den code der ersten Zeile von der öffentlichen Methode geht so:
Beachten Sie, dass addParam() gibt selbst zu, so dass Sie hinzufügen können, mehr Parameter zu überprüfen.
Methode
validate()
werfen wird geprüftValidationException
wenn einer der Parameter null ist (aktiviert oder deaktiviert ist eher eine design - /Geschmacks-Frage, aber meineValidationException
aktiviert ist).Die Meldung enthält den folgenden text, wenn, zum Beispiel, "plant" ist null:
"Illegal argument den Wert null tritt für parameter [Pläne]"
Wie Sie sehen können, den zweiten Wert in die addParam () - Methode (string) wird benötigt für die Benutzer-Nachricht, weil Sie können leicht erkennen, die übergebene variable name, auch mit der Reflexion (nicht Gegenstand dieser post sowieso...).
Und ja, wir wissen, dass jenseits dieser Linie werden wir nicht mehr begegnen, wird ein null-Wert, so dass wir nur sicher aufrufen von Methoden auf diese Objekte.
Diese Weise, den code sauber, leicht wartbar und lesbar.
InformationsquelleAutor der Antwort
Dieser Frage weist darauf hin, dass Sie interessiert sein könnten in der Fehlerbehandlung Strategien. Ihr team der Architekt muss entscheiden, wie Sie arbeiten, Fehler. Es gibt mehrere Möglichkeiten, dies zu tun:
erlauben, die Ausnahmen welligkeit durch - fangen Sie an die 'Haupt-Schleife' oder einige andere verwalten routine.
Sicher haben Sie einen Blick auf Aspekt Orientierte Programmierung - Sie haben ordentlich Möglichkeiten zum einfügen von
if( o == null ) handleNull()
in Ihren bytecode.InformationsquelleAutor der Antwort
Neben der Verwendung
assert
können Sie die folgenden verwenden:Dies ist leicht besser als:
InformationsquelleAutor der Antwort
Nicht nur immer mit null. Don nicht zulassen, dass es.
In meinen Klassen, die meisten Felder und lokale Variablen haben, die nicht null default Werte, und ich füge hinzu vertragserklärungen (immer versichert) überall im code, um sicherzustellen, dass dies durchgesetzt wird (da er kurz und bündig, und mehr Ausdruckskraft, als dass es als eine NPE und dann zu beheben, die Nummer der Zeile, etc.).
Sobald ich angenommen, diese Praxis habe ich festgestellt, dass die Probleme schien sich beheben. Würden Sie fangen die Dinge viel früher in den Entwicklungsprozess nur durch Zufall, und klar, Sie hatte einen schwachen Punkt.. und noch wichtiger.. es hilft Kapseln verschiedene Module, die Anliegen der verschiedenen Module kann 'Vertrauen' zueinander, und nicht mehr littering den code mit
if = null else
Konstrukte!Dies ist die defensive Programmierung und Ergebnisse in viel sauberer code im langen Lauf. Immer bereinigen Sie die Daten, wie z.B. hier durch die Durchsetzung der strengen standards, und die Probleme gehen Weg.
Die Verträge sind wie mini-unit-tests, die immer ausgeführt werden, auch in der Produktion, und wenn die Dinge scheitern, wissen Sie, warum, anstatt eine zufällige NPE, müssen Sie irgendwie herausfinden.
InformationsquelleAutor der Antwort
Guave, ein sehr nützliches core-Bibliothek von Google, hat eine schöne und nützliche API zu vermeiden, die null-Werte. Ich finde UsingAndAvoidingNullExplained sehr hilfreich.
Wie in der wiki:
Verwendung:
InformationsquelleAutor der Antwort
Dies ist ein sehr häufiges problem für jeden Java-Entwickler. So gibt es offizielle Unterstützung für Java 8, um diese Probleme anzugehen, ohne überladen code.
Java 8 eingeführt hat
java.util.Optional<T>
. Es ist ein container, der kann oder kann nicht halten Sie einen nicht-null-Wert. Java 8 gegeben hat, ist ein sicherer Weg zu handle ein Objekt, dessen Wert kann null sein in einigen Fällen. Es ist inspiriert von den Ideen der Haskell und Scala.In einer nussschale, die Optionale Klasse enthält Methoden, um explizit befassen sich mit den Fällen, in denen ein Wert vorhanden ist oder nicht. Aber der Vorteil im Vergleich zu null-Referenzen ist, dass die Optional<T> class Kräfte, Sie denken über den Fall, wenn der Wert nicht vorhanden ist. Als Folge können Sie verhindern, dass unbeabsichtigte null-pointer-exceptions.
Im obigen Beispiel haben wir eine home-service-Fabrik, gibt einen handle auf mehreren Geräten verfügbar zu Hause. Aber diese Dienste möglicherweise oder möglicherweise nicht verfügbar/funktionsfähig; es bedeutet, dass es kann dazu führen, eine NullPointerException. Anstelle der Zugabe eine null
if
Zustand, bevor Sie irgendwelche service, wir wickeln Sie es in an Optional<Service>.TEXTUMBRUCH die OPTION<T>
Betrachten wir eine Methode, um eine Referenz zu einem service aus einer Fabrik. Anstatt die service-Referenz, wickeln Sie es mit Optional. Sie können die API-Anwender wissen Sie, dass die zurückgegebenen service kann nicht verfügbar/funktionsfähig, verwenden Sie defensiv
Wie Sie sehen
Optional.ofNullable()
bietet eine einfache Möglichkeit, um den Verweis gewickelt. Es gibt andere Wege, um den Verweis Optional, entwederOptional.empty()
&Optional.of()
. Eine für die Rückkehr ein leeres Objekt statt umstimmung null ist, und die andere zu wickeln Sie ein null-Objekt, beziehungsweise.ALSO WIE GENAU HILFT ES ZU VERMEIDEN, EINEN NULL-CHECK?
Sobald Sie gewickelt habe ein Referenz-Objekt, Optional bietet viele nützliche Methoden zum aufrufen von Methoden auf wrapped Referenz ohne NPE.
Optional.ifPresent ruft die Verbraucher gegeben mit Hinweis, falls es ein nicht-null-Wert. Ansonsten, es tut sich nix.
Repräsentiert einen Vorgang, der akzeptiert ein single-input-argument und gibt kein Ergebnis. Im Gegensatz zu den meisten anderen funktionalen Schnittstellen, die Verbraucher erwartet wird, zu bedienen über Nebenwirkungen.
Es ist so einfach und sauber zu verstehen. Im obigen code-Beispiel
HomeService.switchOn(Service)
wird aufgerufen, wenn die Optionale holding Referenz nicht null ist.Verwenden wir den ternären operator sehr Häufig für die überprüfung von null-Bedingung und eine alternative Wert oder default-Wert. Optional bietet eine weitere Möglichkeit zum verarbeiten der gleichen Bedingung, ohne zu überprüfen, null. Optional ist.orElse(defaultObj) gibt defaultObj, wenn die Optionale null-Wert. Lassen Sie uns dieses in unserem Beispiel-code:
Nun HomeServices.get() macht dasselbe, aber in einer besseren Art und Weise. Es wird überprüft, ob der Dienst bereits initialisiert nicht. Wenn es dann wieder die gleiche oder eine neue erstellen Neue service. Optional<T>.orElse(T) hilft, um wieder eine default-Wert.
Schließlich, hier ist unser NPE sowie null-check-gratis-code:
Den gesamten post ist NPE sowie Null-check-freier code ... Wirklich?.
InformationsquelleAutor der Antwort
Ich mag die Artikel von Nat Pryce. Hier sind die links:
In dem Artikel ist auch ein link auf ein Git-repository für Java Vielleicht Geben die ich interessant finde, aber ich glaube nicht, dass es allein reduziert werden kann, die
überprüfen von code aufblähen. Nach einigen Recherchen im Internet, ich denke,! = null code aufblasen könnte verringert werden, vor allem durch die sorgfältige Gestaltung.
InformationsquelleAutor der Antwort
Ich habe versucht, die
NullObjectPattern
aber für mich ist nicht immer der beste Weg zu gehen. Es gibt manchmal, wenn ein "no action" ist nicht geeignet.NullPointerException
ist ein Laufzeit-exception das bedeutet, dass Entwickler Fehler und mit genug Erfahrung ist es, der dir genau sagt, wo der Fehler ist.Nun zu der Antwort:
Versuchen, alle Ihre Attribute und Ihre Zugriffsmethoden so privat wie möglich oder zu vermeiden, setzen die Kunden auf allen. Sie können das argument-Werte im Konstruktor natürlich, aber durch die Reduzierung der Bereich, den Sie lassen Sie sich nicht von der client-Klasse übergeben Sie einen ungültigen Wert. Wenn Sie brauchen, um die Werte ändern, können Sie immer einen neuen
object
. Überprüfen Sie die Werte im Konstruktor nur einmal und in den rest der Methoden, die Sie können fast sicher sein, dass die Werte nicht null sind.Natürlich, die Erfahrung der bessere Weg, um das verstehen und anwenden dieser Vorschlag.
Byte!
InformationsquelleAutor der Antwort
Wahrscheinlich die beste alternative für Java 8 oder höher ist die Verwendung der
Optional
Klasse.Dies ist besonders praktisch für lange Ketten von möglichen null-Werten. Beispiel:
Beispiel, wie throw Ausnahme auf null:
Java 7 eingeführt, die
- Objekten.requireNonNull
Methode praktisch sein kann, wenn etwas überprüft werden soll, für nicht-nullness. Beispiel:InformationsquelleAutor der Antwort
Kann ich die Antwort im Allgemeinen auf Sie!
Wir in der Regel Gesicht dieses Problem, wenn die Methoden get die Parameter in der Weise, die wir nicht erwartet (schlechte Methode Programmierer Schuld). Zum Beispiel: Sie erwarten, um ein Objekt, sondern Sie bekommen eine null. Erwarten Sie, um eine Zeichenfolge mit mindestens einem Zeichen, stattdessen erhalten Sie einen leeren String ...
Es gibt also keinen Unterschied zwischen:
}
oder
Beide wollen sicherstellen, dass wir empfangene gültige Parameter, bevor wir das tun andere Funktionen.
Wie bereits in einigen anderen Antworten, um zu vermeiden, über Probleme, die Sie Folgen können, die Design by contract Muster. Bitte sehen http://en.wikipedia.org/wiki/Design_by_contract.
Implementieren dieses pattern in java, können Sie mit core java-Annotationen wie javax.Anmerkung.NotNull oder Sie anspruchsvollere Bibliotheken, wie Hibernate Validator.
Nur ein Beispiel:
Nun kann man sicher entwickeln sich die Kern-Funktion der Methode, ohne Eingabeparameter überprüfen, hüten Sie Ihre Methoden aus unerwarteten Parametern.
Können Sie einen Schritt weiter gehen und stellen Sie sicher, dass nur gültige pojos erzeugt werden konnte, die in Ihrer Anwendung. (Beispiel aus der hibernate-validator-Website)
InformationsquelleAutor der Antwort
Ich sehr ignorieren Antworten, die nahelegen, dass mit den null-Objekten in jeder situation. Dieses Muster kann den Vertrag zu brechen und bury Probleme tiefer und tiefer, anstatt Sie zu lösen, nicht zu erwähnen, dass unsachgemäß verwendet wird, erstellen Sie eine weitere Stapel von boilerplate-code, die verlangen, dass zukünftige Wartung.
In der Realität, wenn etwas von einer Methode zurückgegebenen null sein kann, und der aufrufende code hat, um Entscheidung zu treffen, auf, dass, sollte es einen früheren Aufruf sorgt dafür, dass der Staat.
Beachten Sie auch, dass die null-Objekt-pattern-Speicher-hungrig, wenn verwendet, ohne Pflege. Für diese - die Instanz einer NullObject sollte geteilt werden zwischen den Eigentümern, und nicht eine unigue-Instanz für jede dieser stellen.
Ich würde auch nicht empfehlen, mit diesem Muster, wo der Typ ist dazu gedacht, eine primitive Darstellung - wie mathematische Entitäten, die nicht-Skalare: Vektoren, Matrizen, komplexe zahlen und POD(Plain Old Data) Objekte, die dazu gedacht sind, halten Staat in form von Java-built-in-Typen. Im letzteren Fall würden Sie am Ende ruft getter-Methoden mit beliebigen Ergebnissen. Zum Beispiel, was sollte ein NullPerson.getName () - Methode zurückgeben?
Ist es eine überlegung Wert solche Fälle, um zu vermeiden, absurde Ergebnisse.
InformationsquelleAutor der Antwort
Tun dies in Ihrem eigenen code und können Sie vermeiden != null prüft.
Meisten der Zeit, die null-Prüfungen scheinen guard-Schleifen über collections oder arrays, also nur initialisieren Sie Sie leer, werden Sie nicht brauchen, alle null-Kontrollen.
Es ist ein kleiner Aufwand, aber es lohnt sich für saubereren code und weniger NullPointerExceptions.
InformationsquelleAutor der Antwort
Dies ist der häufigste Fehler für die meisten Entwickler.
Wir haben die Anzahl der Möglichkeiten, dies zu behandeln.
Ansatz 1:
notNull(Object Object, String message)
Ansatz 2:
Ansatz 3:
Ansatz 4:
InformationsquelleAutor der Antwort
InformationsquelleAutor der Antwort