Wie können @Nullable- und @Nonnull-Annotationen effektiver verwendet werden?
Kann ich sehen, dass @Nullable
und @Nonnull
Anmerkungen könnte hilfreich sein bei der Verhinderung NullPointerException
s aber nicht sehr weit verbreiten.
- Die Wirksamkeit dieser Anmerkungen drop-off vollständig nach eine Ebene der Dereferenzierung, so dass, wenn Sie nur fügen Sie ein paar Sie nicht vermehrt sehr weit.
- Da diese Anmerkungen sind nicht gut durchgesetzt, besteht die Gefahr, vorausgesetzt, ein Wert markiert mit
@Nonnull
ist nicht null und daher nicht der Durchführung der null-Kontrollen.
Den code unten bewirkt, dass ein parameter markiert mit @Nonnull
zu null
werden, ohne dass irgendwelche Beschwerden. Es wirft ein NullPointerException
wenn es ausgeführt wird.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
//this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
//this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); //do stuff to x
}
}
Gibt es einen Weg, um diese Anmerkungen mehr strikt durchgesetzt werden, und/oder weiter verbreiten?
InformationsquelleAutor der Frage Mike Rylander | 2012-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: ich denke, dass diese Anmerkungen sind nur nützlich für Ihre IDE, um Sie zu warnen potenziell null-pointer-Fehler.
Wie gesagt in der "Clean Code" Buch, das Sie sollten überprüfen, Ihre öffentliche Methode mit Parametern und auch vermeiden, überprüfen von Invarianten.
Ein weiterer guter Tipp ist, niemals kehren Sie zurück, null-Werte, aber mit Null-Objekt-Pattern statt.
InformationsquelleAutor der Antwort Pedro Boechat
Neben Sie IDE-geben Sie Hinweise darauf, dass Sie pass
null
wo es wird erwartet, dass nicht null ist, haben Sie weitere Vorteile:So kann es helfen, zu erstellen Sie code, der mehr wartbar (Sie brauchen nicht
null
Prüfungen) und weniger Fehler-anfällig.InformationsquelleAutor der Antwort Uwe Plonus
Kompilieren der original-Beispiels in Eclipse bei Einhaltung der 1.8 und mit der annotation basierend null-Analyse aktiviert ist, bekommen wir diese Warnung:
Dieser Warnung lautet in Analogie zu diesen Warnungen, die Sie erhalten, wenn Sie mischen generified code mit dem legacy code mit raw-Typen ("unchecked conversion"). Wir haben genau die gleiche situation hier: Methode
indirectPathToA()
hat eine "legacy" - Signatur-in, dass es nicht geben Sie alle null Vertrag. Werkzeuge können einfach melden Sie diese, so werden Sie jagen Sie nach unten alle Gassen, wo die null-Anmerkungen vermehrt werden, aber (noch) nicht.Und wenn mit einem cleveren
@NonNullByDefault
wir haben noch nicht einmal zu sagen, dass dies zu jeder Zeit.In anderen Worten: ob oder ob nicht null Anmerkungen "propagieren sehr weit" kann, hängt von dem Werkzeug, das Sie verwenden, und wie konsequent Sie kümmern sich um alle Abmahnungen, die von dem tool. Mit TYPE_USE null Anmerkungen Sie endlich die Möglichkeit haben, lassen Sie das tool warnen Sie jeder möglich NPE in Ihrem Programm, weil nullness hat sich eine intrisic-Eigenschaft vom Typ system.
InformationsquelleAutor der Antwort Stephan Herrmann
Ich denke, diese ursprüngliche Frage, die indirekt Punkte, um eine Allgemeine Empfehlung, die run-time eine null-pointer-Prüfung ist weiterhin erforderlich, auch wenn @Null verwendet wird. Finden Sie auf den folgenden link:
Java 8 ist neuer Typ Anmerkungen
In den oben genannten blog, es wird empfohlen, dass:
InformationsquelleAutor der Antwort jonathanzh
Ich bin damit einverstanden, dass die " Anmerkungen "nicht vermehrt sehr weit". Allerdings sehe ich den Fehler auf der Programmierer-Seite.
Verstehe ich die
Nonnull
Anmerkung der Dokumentation. Die folgende Methode ausdrückt, verlangt (als Voraussetzung) ein nicht-null-argumentx
.Den folgenden code-snippet dann einen Fehler enthält. Die Methode ruft
directPathToA()
ohne zu erzwingen, dassy
nicht null ist (das heißt, es garantiert nicht, dass die Vorbedingung des aufgerufenen Methode). Eine Möglichkeit ist das hinzufügen einerNonnull
- Vermerk, sowie zuindirectPathToA()
(Vermehrung der Voraussetzung). Möglichkeit zwei ist zu prüfen, für die Nichtigkeit dery
imindirectPathToA()
und zu vermeiden, den Anruf zudirectPathToA()
wenny
null ist.InformationsquelleAutor der Antwort Andres
Dem, was ich in meinen Projekten ist die Aktivierung der folgenden option in der "Konstanten Bedingungen & Ausnahmen" code-Inspektion:
Schlage vor, @Nullable-Anmerkung für die Methoden, die möglicherweise null zurückgeben, und Bericht nullable übergebenen Werte nicht-annotierten Parameter
Wenn aktiviert, werden alle nicht-annotierten Parameter behandelt werden, die nicht null und somit werden Sie auch sehen, eine Warnung auf Ihrem indirekten Aufruf:
Für eine noch stärkere Kontrollen der Checker-Framework kann eine gute Wahl sein (siehe dieses schöne tutorial.
Hinweis: ich habe nicht verwendet, noch nicht und kann es Probleme mit der Jack-compiler: siehe dieser bugreport
InformationsquelleAutor der Antwort TmTron
In Java verwende ich Guave ist Optional Typ. Ein tatsächlicher Art, die Sie bekommen compiler garantiert über seine Verwendung. Es ist leicht zu umgehen und erhalten eine
NullPointerException
aber zumindest die Signatur der Methode eindeutig kommuniziert, was er erwartet als argument oder was es zurückgeben kann.InformationsquelleAutor der Antwort Ionuț G. Stan
Wenn Sie Kotlin, es unterstützt diese null-Zulässigkeit von Anmerkungen in Ihre compiler-und verhindert, dass Sie bei übergabe eines null-Wert an eine java-Methode, die erfordert, dass ein nicht-null-argument. Ereignis, obwohl diese Frage wurde ursprünglich gezielt an Java, ich erwähne dies, Kotlin Funktion, weil es ist speziell gezielt an diese Java-annotation und die Frage war "gibt es einen Weg, um diese Anmerkungen mehr strikt durchgesetzt werden, und/oder weiter verbreiten?" und diese Funktion ist diese Anmerkung mehr strikt durchgesetzt werden.
Java-Klasse mit
@NotNull
annotationKotlin-Klasse aufrufen von Java-Klasse und übergeben null für das argument annotiert mit @NotNull
Kotlin compiler-Fehler, die Durchsetzung der
@NotNull
annotation.finden Sie unter: http://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations
InformationsquelleAutor der Antwort Mike Rylander