Ich bin mit einem erfahreneren Entwickler in dieser Frage nicht einverstanden und frage mich, was andere darüber denken. Unsere Umgebung ist Java, EJB 3, Services usw.
Der Code, den ich geschrieben habe, ruft einen Dienst auf, um Dinge zu bekommen und Dinge zu erstellen. Das Problem, auf das ich stieß, war, dass ich Nullzeigerausnahmen bekam, die keinen Sinn machten. Wenn ich beispielsweise den Dienst auffordere, ein Objekt zu erstellen, erhalte ich null zurück. Wenn ich versuche, ein Objekt mit einer bekannten gültigen ID nachzuschlagen, erhalte ich null zurück. Ich habe einige Zeit damit verbracht herauszufinden, was in meinem Code falsch war. Da ich weniger erfahren bin, gehe ich normalerweise davon aus, dass ich etwas falsch gemacht habe, aber es stellt sich heraus, dass der Grund für die Null-Rückgabe die Sicherheit war. Wenn der Benutzerprinzipal, der meinen Dienst verwendet, nicht über die richtigen Berechtigungen für den Zieldienst verfügt, wird einfach null zurückgegeben. Die meisten anderen Dienste hier sind ebenfalls nicht sehr gut dokumentiert, daher ist dies anscheinend nur etwas, was Sie wissen müssen.
Dies ist ziemlich verwirrend, da Entwickler Code schreiben, der mit dem Dienst interagiert. Es wäre für mich viel sinnvoller, wenn der Dienst eine Ausnahme wäre, die mir sagt, dass der Benutzer nicht über die richtigen Berechtigungen zum Laden oder Erstellen dieses Dings verfügt. Ich würde dann sofort wissen, warum mein Service nicht wie erwartet funktioniert.
Der erfahrenere Entwickler, der den Service geschrieben hat, argumentierte, dass das Anfordern der Daten keine Fehlerbedingung ist und dass Ausnahmen nur in einer Fehlerbedingung ausgelöst werden sollten, nicht wenn der Benutzer keinen Zugriff auf die Daten hat. Diese Daten werden häufig in einer GUI nachgeschlagen, und für Benutzer ohne die richtigen Berechtigungen sind diese Dinge einfach "nicht vorhanden". Kurz gesagt: Fragen ist nicht falsch, daher keine Ausnahme. Get-Methoden geben null zurück, da diese Dinge für diese Benutzer "nicht vorhanden" sind. Erstellungsmethoden geben null zurück, wenn der Benutzer das Ding nicht erstellen durfte.
Ist das normal und / oder eine gute Praxis? Ich bevorzuge Ausnahmen, weil ich es viel einfacher finde zu wissen, was los ist. So würde ich zum Beispiel auch lieber eine NotFoundException auslösen, wenn Sie nach einem Objekt mit einer ungültigen ID gefragt haben, anstatt null zurückzugeben.
quelle
Antworten:
Nach etwas zu fragen ist vielleicht kein Fehler, aber keine Berechtigung für etwas zu haben, nach dem Sie gefragt haben, ist sicherlich eine Art Fehler. Ausnahmen sind eine alternative Möglichkeit, außergewöhnliche Bedingungen zu melden, die anstelle spezieller Rückgabewerte verwendet werden sollen (z. B.
null
was, wie Sie geschrieben haben, absolut keine Hilfe ist, wenn es> 1 mögliche Gründe gibt, warum Dinge schief gehen könnten (selbst wenn dies der Fall ist) Genau 1 möglicher Grund jetzt, es könnte 2 mögliche Gründe in der nächsten Version geben, also würde die Verwendungnull
als Rückgabewert, der einen Fehler anzeigt, bedeuten, dass Sie sich selbst in die Ecke malen)). Wenn der Service in keiner Weise meldet, warum er nicht das tut, wonach Sie gefragt haben, ist das Design definitiv schlecht.Ob ein spezieller Rückgabewert verwendet werden soll (z. B. negative Ganzzahlen sind nützlich für Funktionen, die normalerweise eine nichtnegative Ganzzahl zurückgeben), eine Ausnahme, ein globaler Fehlerbehandler oder Logger usw., ist am Ende ein Implementierungsdetail. Die Wahl hängt von der Sprache, der Situation, den Konventionen ab und ist auch eine Frage des Geschmacks. Der Hauptpunkt ist, dass es einen direkten Weg geben sollte, um herauszufinden, warum etwas nicht funktioniert. Andernfalls besteht Ihre einzige Möglichkeit darin, mit verschiedenen Optionen und was auch immer herumzusuchen, um herauszufinden, was mit dem Verhalten der Black Box korreliert, und es ist Zeitverschwendung.
String.substring()
wirft ein,IndexOutOfBoundsException
wenn der Index außerhalb der Grenzen liegt. Ich kann mir keine Vorteile für die Rückkehrnull
vorstellen, obwohl man - philosophisch gesehen - argumentieren könnte, dass aString
nichts außerhalb seiner Grenzen enthält, alsonull
wäre dies ein logischer Rückgabewert. Logisch-philosophisch und praktisch zu sein, sind offensichtlich zwei verschiedene Tiere.quelle
substring
die Rückgabe einer Nullreferenz. IMHO sollte es zwei separate Funktionen geben - eine verspricht, entweder die angeforderte Anzahl von Zeichen zurückzugeben oder eine Ausnahme auszulösen, und eine gibt so viel wie möglich zurück. Jede Methode wäre in einigen Zusammenhängen der anderen wesentlich überlegen.Es kommt darauf an, was der Vertrag ist. Wenn Ihr Vertrag besagt, dass Sie etwas anfordern können, das nicht existiert, sollte er angeben, was passiert (null oder null Objekt).
Wenn Ihr Vertrag jedoch besagt, dass Sie zuerst eine andere Methode aufrufen sollten (
DoesSomethingExist()
) und dann dieGet
Methode aufrufen sollen , könnte Ihr Vertrag möglicherweise besagen, dass Sie nur vorhandene Elemente abrufen und eine Ausnahme auslösen können, wenn dies nicht der Fall ist. Die Ausnahmemeldung könnte etwa "DoesSomethingExist()
Zuerst anrufen" lauten, was eine nützliche Fehlermeldung ist.quelle
findAllThings
Methode gäbe, würde ich sagen, dass es angemessen ist, eine leere Liste oder eine Teilmenge zurückzugeben, wenn es einige oder alle Dinge gibt, die Sie nicht sehen dürfen. Auf die gleiche Weise könnte ich in einem Blog nur Beiträge zum Bearbeiten auflisten, die dem aktuellen Benutzer gehören. Aber wenn dieser Benutzer dann versucht hat, die URL zu optimieren und einen anderen Beitrag zu bearbeiten ...Es gibt keine einheitliche Antwort auf die Frage. Ob Ausnahmen verwendet werden oder null zurückgegeben wird, hängt von der jeweiligen Situation ab.
Anstatt dies nur aus dogmatischer Sicht zu betrachten, betrachten Sie die Benutzeroberfläche als Benutzeroberfläche . Benutzeroberflächen sollten verwendbar sein . Wählen Sie also unabhängig von Ihrer eigenen Meinung zur "richtigen" Vorgehensweise die Methode aus, die aus der Sicht einer Person, die Ihre Benutzeroberfläche verwendet, am besten geeignet ist.
Wenn der Aufrufer wissen muss, warum ein Objekt nicht zurückgegeben wird, ist eine Ausnahme angebracht. Wenn das allgemeine Konzept jedoch lautet: "Wenn Sie keine Berechtigung haben, existiert sie nicht", ist die Null akzeptabel.
Insbesondere in Ihrem Fall würde ich sagen, dass Nullen für die Suche nach einem Element durchaus akzeptabel sind, wenn der Anrufer sich zuerst anmelden oder eine Verbindung zum Server herstellen muss. Dann wird Ihnen gesagt, dass Sie die Erlaubnis haben oder nicht. Sobald Sie das Tor passiert haben, ist es vernünftig, dass Sie bei der Suche nach etwas, das Sie nicht sehen dürfen (oder gar wissen, dass es existiert), eine Null erhalten sollten.
Wenn Sie andererseits keine anfängliche Verbindung oder keinen Anmeldeschritt haben, ist eine Ausnahme sinnvoll. Wenn der Anrufer weiß, dass ein Element vorhanden ist und es nicht zurückerhält, ist die API nicht hilfreich, um nur eine Null zurückzugeben.
Für das Erstellen eines Elements ist dies jedoch eine andere Geschichte. Vermutlich kann es viele Gründe dafür geben, dass dies fehlschlägt - keine Berechtigungen, fehlerhafte Parameter, nicht genügend Arbeitsspeicher usw. Wenn der Entwickler für all diese Bedingungen eine Null erhält, kann er keine geeignete Vorgehensweise festlegen .
Um die Frage zu beantworten, fragen Sie sich, welche Lösung aus der Sicht einer Person, die den Dienst nutzt, am nützlichsten ist. Es kann sein, dass die Art und Weise, wie Sie es verwenden, untypisch ist und im häufigsten Fall eine Null die richtige Antwort ist.
Also, geraten Sie nicht in einen religiösen Krieg, sondern entscheiden Sie, was für dieses spezielle Problem richtig ist.
quelle
Ich denke definitiv, dass es ein schlechtes Design ist . Der Nullzeiger ist für mich keine gültige Antwort und kann schwierig zu verwalten sein.
Wenn der Benutzer versucht, einen Dienst ohne die richtigen Anmeldeinformationen zu verbinden, sollte ich mit einer klaren und präzisen Antwort antworten. Die Antwort könnte eine Ausnahme oder ein spezielles Objekt sein, aber nicht null.
Sie sollten die Nullantwort belassen, wenn die Netzwerkverbindung unterbrochen ist oder eine andere unerwartete kritische Fehlfunktion vorliegt.
Darüber hinaus ist die Zeit, die Sie damit verbringen, zu verstehen, warum Sie eine Null erhalten haben, ein starkes Argument. Jeder Code sollte leicht zu verstehen und zu verwenden sein. Ein Nullwert ist nicht der Fall.
quelle
Unter Berücksichtigung eines guten Software-Designs sollten Sie über die Lebensdauer Ihres Projekts nachdenken.
Durch die Rücksendung
null
geben Sie dem Kunden, wie bereits gesagt, keine Informationen. Schauen Sie, was mit Ihnen passiert ist. Zuerst haben Sie nicht bemerkt, wo das Problem liegt. Wenn keine Dokumentation angegeben wird, ist dies ein Chaos.Wenn Sie eine Ausnahme auslösen, können Sie feststellen, was schief gelaufen ist. Sie können den angezeigten Text sogar genauer anpassen, wenn Sie möchten.
Wenn
null
Sie jedoch zurückkehren, lassen Sie den Kunden untersuchen, was gerade passiert.Außerdem haben Sie festgestellt, dass es ein Problem gibt, weil Sie woanders hingekommen sind
NullPointerException
. Stellen Sie sich nun vor, Sie speichern die Rückgabe dieser Funktion nicht ... Sie werden gezwungen sein, jeden Aufruf dieser Funktion mit einemif else
Block zu umgeben ...Aus meiner Sicht ist die Rückkehr
null
eine schlechte Praxis.quelle
Aus meiner Sicht macht dies keinen Sinn.
Das Abfragen von Daten ohne Berechtigung sollte zu einer Ausnahme führen, da es sich um ein unerwartetes Ergebnis handelt - um kein Ergebnis zu erhalten - ohne ordnungsgemäßen Zugriff.
Analogie : Der Antwortcode für eine
GET
ohne Autorisierung ist nicht200 ok
ohne Daten, sondern tatsächlich401 Unauthorized
.quelle
Null zurückzugeben ist nicht großartig. Es sagt dir nichts. Wenn eine App versucht, etwas nachzuschlagen, und die Antwort für beide Sicherheitsprobleme null ist und wenn das Element nicht vorhanden ist, wie erkennen Sie dann den Unterschied zwischen den beiden?
Eine aussagekräftige Antwort kann es der Anwendung ermöglichen, logische Entscheidungen darüber zu treffen, was als nächstes zu tun ist oder wie Probleme zu lösen sind.
quelle
Wenn die Hauptursache ein nicht authentifizierter Benutzer ist, bevorzuge ich eine harte HTTP 401-Antwort, möglicherweise mit einer Weiterleitung zu einer hübschen Nachrichtenseite (und einer Benachrichtigung an jemanden, der sich darum kümmert). Zulassungsbedingte Ursachen treten eher von Fall zu Fall auf. Es gibt Argumente für die Rückgabe von HTTP-Fehlern (z. B. 403) und Argumente für die Rückgabe spezieller wohlgeformter Codes / Nachrichten in der Dienstantwort.
Ausnahmen sollten nur unter außergewöhnlichen Umständen verwendet werden und bedeuten, dass etwas schief gelaufen ist. Ich bin nicht der Meinung, dass sie überladen werden sollten, um "nicht erlaubt" zu bedeuten. (Gleiches gilt für den Null-Rückgabewert: Ich bin nicht der Meinung, dass er "nicht erlaubt" bedeuten sollte.)
quelle
Um Devils Advocate zu spielen, werde ich versuchen, die Seite der Rückgabe von Null zu vertreten.
Meiner Meinung nach gibt es nur eine Situation, in der diese Art der Reaktion nahezu akzeptabel ist, und zwar wie in diesem Fall, wenn es um Sicherheit geht.
Es ist sehr einfach, versehentlich Details Ihres Systems preiszugeben, von denen Unbefugte nichts wissen sollten. Dies sollte vermieden werden.
Nehmen Sie zum Beispiel einen Prüfer für Benutzername und Passwort. Das Zurückgeben eines Fehlers "Benutzername nicht gefunden" und eines Fehlers "Falsches Passwort" als separate Fehlercodes würde Sie offensichtlich für schwerwiegende Sicherheitsprobleme öffnen, da jemand zuerst nach einem gültigen Benutzernamen und dann nach einem Passwort suchen könnte. Die Rückgabe eines generischen "Ungültigen Benutzernamens / Passworts" wäre eine bessere Option.
In diesem speziellen Fall würde ich sagen, dass es fast in Ordnung ist, zurückzukehren,
null
aber ich stimme zu, es wäre sehr unangenehm, damit zu arbeiten.quelle
null
genau die am wenigsten hilfreiche Antwort. Fast alles andere könnte möglicherweise verwendet werden, um etwas über das System herauszufinden. Der Grund, warum sich OP beschwerte, war, dass dienull
Rückgabe nicht nur nichts erklärte, sondern auch nicht hilfreich war. Das ist das bewusste Ziel ... absolut nichts zu sagen und nicht hilfreich zu sein. Mission aus meiner Sicht erfüllt.Ich denke, return null ist unfreundlich. Wenn der Client diese Methode aufruft und null zurückgibt, weiß der Client nicht, was passiert ist und warum er null zurückgegeben hat. Wir sollten also eine sinnvolle Ausführung ausführen und eine Dokumentation bereitstellen, um diese Ausführung zu beschreiben.
quelle