Was ist in Java besonders zu empfehlen und warum? Beide Typen lösen Ausnahmen aus, daher ist der Umgang mit ihnen in dieser Hinsicht der gleiche. assert
ist etwas kürzer, aber ich bin mir nicht sicher, wie wichtig das ist.
public void doStuff(Object obj) {
assert obj != null;
...
}
vs
public void doStuff(Object obj) {
if (obj == null) {
throw new IllegalArgumentException("object was null");
}
...
}
java
exceptions
conventions
Daenyth
quelle
quelle
obj.hashCode()
stattdessen eine einfache ;-)Antworten:
IN ACHT NEHMEN!
Zusicherungen werden zur Laufzeit entfernt, sofern Sie beim Kompilieren des Codes nicht explizit angeben, dass Zusicherungen aktiviert werden sollen. Java-Assertions dürfen nicht im Produktionscode verwendet werden und sollten auf private Methoden beschränkt werden (siehe Ausnahme vs. Assertion ), da private Methoden nur den Entwicklern bekannt sein und von diesen verwendet werden sollen. Auch
assert
werfen AssertionError , die sichError
nichtException
, und die in der Regel bedeutet , dass Sie einen sehr abnormal Fehler haben (wie „OutOfMemoryError“ , die von schwer zu erholen, nicht wahr?) Sie sind nicht in der Lage sein zu behandeln , erwartet.Entfernen Sie das Flag "enable assertions" und überprüfen Sie mit einem Debugger, ob Sie den Auslöser "IllegalArgumentException" nicht verwenden ... da dieser Code nicht kompiliert wurde (erneut, wenn "ea" entfernt wurde).
Es ist besser, die zweite Konstruktion für öffentliche / geschützte Methoden zu verwenden, und wenn Sie etwas wollen, das in einer Codezeile ausgeführt wird, gibt es mindestens einen Weg, den ich kenne. Ich persönlich verwende die Spring Framework -
Assert
Klasse, die einige Methoden zum Überprüfen von Argumenten enthält und bei Fehlern "IllegalArgumentException" auslöst. Grundsätzlich ist das, was Sie tun:... der tatsächlich genau den Code ausführt, den Sie in Ihrem zweiten Beispiel geschrieben haben. Es gibt ein paar andere nützliche Methoden wie
hasText
,hasLength
da drin.Ich schreibe nicht gerne mehr Code als nötig, deshalb bin ich froh, wenn ich die Anzahl der geschriebenen Zeilen um 2 reduziere (2 Zeilen> 1 Zeile) :-)
quelle
java -ea
und programmgesteuert aktiviert werden . @ Jalayn Ich denke, Behauptungen im Produktionscode sind absolut gültig, da sie für das Debuggen im Feldjava -ea
.Objects.requreNonNull
Sie müssen eine Ausnahme verwenden. Die Verwendung einer Behauptung wäre ein Missbrauch der Funktion.
Ungeprüfte Ausnahmen dienen dazu, Programmierfehler der Benutzer Ihrer Bibliothek zu erkennen, während Zusicherungen dazu dienen, Fehler in Ihrer eigenen Logik zu erkennen . Dies sind separate Themen, die nicht gemischt werden sollten.
Zum Beispiel eine Behauptung
bedeutet "Ich weiß, dass jeder Codepfad, der zu dieser Behauptung führt, sicherstellt, dass
myConnection
eine Verbindung besteht. Wenn der obige Code keine gültige Verbindung herstellen konnte, hätte er eine Ausnahme auslösen oder zurückkehren müssen, bevor dieser Punkt erreicht ist."Auf der anderen Seite ein Scheck
bedeutet "Das Aufrufen meiner Bibliothek ohne Verbindungsaufbau ist ein Programmierfehler".
quelle
Wenn Sie eine Funktion schreiben, die keinen
null
gültigen Parameterwert zulässt , sollten Sie die@Nonnull
Anmerkung zur Signatur hinzufügen undObjects.requireNonNull
prüfen, ob das Argument ein ist,null
und ein auslösen, wenn dies der FallNullPointerException
ist. Die@Nonnull
Anmerkung dient der Dokumentation und gibt in einigen Fällen beim Kompilieren hilfreiche Warnungen aus. Es verhindert nicht, dassnull
es zur Laufzeit übergeben wird.Update: Die
@Nonnull
Annotation ist nicht Bestandteil der Java-Standardbibliothek. Stattdessen gibt es zahlreiche konkurrierende Standards aus Bibliotheken von Drittanbietern (siehe Welche @NotNull-Java-Annotation soll ich verwenden? ). Das bedeutet nicht, dass es eine schlechte Idee ist, es zu benutzen, nur dass es nicht Standard ist.quelle
Objects.requireNonNull()
, das war neu für mich. Wissen Sie, ob es irgendwo eine ähnliche Methode "requireTrue ()" oder "requireEqual ()" gibt? Nichts gegen Spring's Assert, aber nicht jeder nutzt das.Objects.requireNonNull()
dient zur Argumentüberprüfung. Wenn ein Argumenttrue
gleich oder gleich etwas sein muss, ist das Argument sinnlos. Für die Fehler anderen Fällen als illegal Argumente, sollten Siethrow
ein ,Exception
die mehr beschreibt genau den Fehler. Es gibt auch JUnit,Assert
aber das ist für Tests.Objects.requireTrue(x >= 0.0);
oder aus einem HashObjects.requireEquals(hash.length == 256)
Ich ziehe es immer vor, IllegalArgumentException über Behauptungen zu werfen.
Zusicherungen werden hauptsächlich in JUnit oder anderen Testwerkzeugen verwendet, um Testergebnisse zu überprüfen / zu bestätigen. Andere Entwickler könnten daher den falschen Eindruck erwecken, dass Ihre Methode eine Testmethode ist.
Es ist auch sinnvoll, IllegalArgumentException auszulösen, wenn einer Methode ein ungültiges oder unangemessenes Argument übergeben wurde . Dies steht im Einklang mit der Ausnahmebehandlungskonvention, die von Java-Entwicklern befolgt wird.
quelle
IMO das zweite ist etwas besser, weil es mehr Informationen bringt und weiter erweitert werden könnte (zB durch Erweiterung der Ausnahmeklasse), um noch informativer zu sein, außerdem verwendet es keinen negativen Vergleich, der einfacher zu verstehen ist.
quelle
Ich verwende nicht viel aserts, aber einen gemeinsamen Ansatz mit Lombock @NonNull: https://projectlombok.org/features/NonNull
Lombok-Implementierung: lombok.NonNull importieren;
Java-Version:
Lombok ist eine sehr schöne Bibliothek, die ich überall benutze
quelle