Frage

Ich bin von einem .NET-Hintergrund und Dilettantismus jetzt in Java.

Derzeit bin ich große Probleme eine API defensiv gegen fehlerhafte Eingabe zu entwerfen. Sagen wir, ich habe den folgenden Code bekam (nahe genug):

public void setTokens(Node node, int newTokens) {
    tokens.put(node, newTokens);
}

Allerdings kann dieser Code aus zwei Gründen fehlschlagen:

  1. Benutzer übergibt einen null Knoten.
  2. Benutzer übergibt einen ungültigen Knoten, das heißt eine in der Grafik nicht enthalten ist.

In .NET, würde ich ein ArgumentNullException (statt einem NullReferenceException!) oder ein ArgumentException jeweils den Namen des betreffenden Argument (node) als string Argument übergeben.

Java scheint nicht gleichwertig Ausnahmen zu haben. Ich weiß, dass ich mehr spezifisch sein könnte und nur werfen, was Ausnahme am nächsten kommt, um die Situation zu beschreiben, oder sogar meine eigene Exception-Klasse für die spezifische Situation zu schreiben.

Ist dies die beste Praxis? Oder gibt es Allzweck- Klassen ähnlich in .NET ArgumentException?

Ist es überhaupt sinnvoll gegen null in diesem Fall zu überprüfen? Der Code wird fehlschlagen sowieso und die Stack-Trace der Ausnahme des oben Methodenaufruf enthält. Prüfung gegen null scheint überflüssig und übertrieben. Zugegeben, wird der Stack-Trace sein leicht Reiniger (da ihr Ziel ist das obige Verfahren, anstatt eine interne Prüfung in der HashMap Umsetzung der JRE). Aber dies muss gegen die Kosten eines zusätzlichen if Rechnung verrechnet werden, die darüber hinaus sollte nie sowieso auftreten - immerhin null dem obigen Verfahren vorbei ist nicht eine erwartete Situation, es ist eine ziemlich dumm Fehler. Erwarten es ist geradezu paranoid - und es wird mit der gleichen Ausnahme auch fehlschlagen, wenn ich nicht überprüfen, denn es

.

[Wie bereits in den Kommentaren darauf hingewiesen, HashMap.put erlaubt tatsächlich null Werte für den Schlüssel. So eine Prüfung gegen null würde nicht unbedingt Redundante hier.]

War es hilfreich?

Lösung

Verschiedene Gruppen haben unterschiedliche Standards.

Erstens ich nehme an, Sie kennen den Unterschied zwischen RuntimeExceptions (ungeprüft) und normalen Exceptions (markiert), wenn nicht, dann a href sehen <= "https://stackoverflow.com/questions/613954/the-case-against- checkten Ausnahmen "> diese Frage und die Antworten . Wenn Sie eine eigene Ausnahme schreiben können Sie es zwingen, erwischt werden, während beide NullPointerException und IllegalArgumentException sind die Runtime in manchen Kreisen verpönt auf.

Zweitens, wie mit Ihnen, Gruppen, die ich gearbeitet habe, aber nicht aktiv nutzen behauptet, aber wenn Ihr Team (oder Verbraucher der API) hat beschlossen, sie verwenden behauptet, dann klingt behaupten wie genau der richtigen Mechanismus.

Wenn ich Sie wäre, würde ich NullPointerException verwenden. Der Grund hierfür ist Präzedenzfall. Nehmen wir ein Beispiel Java-API von Sun, zum Beispiel java.util.TreeSet . Dies nutzt NPE für genau diese Art von Situation, und während es Ihr Code sieht wie nur ein Null verwendet wird, ist es durchaus angemessen.

Wie andere gesagt haben IllegalArgumentException ist eine Option, aber ich denke Nullpointer kommunikativer ist.

Wenn diese API entwickelt, wird von externen Unternehmen genutzt werden / Teams würde ich mit NullPointerException bleiben, aber stellen Sie sicher, dass es in der javadoc deklariert wird. Wenn es für den internen Gebrauch ist, dann könnte sich entscheiden, dass du deine eigene Exception-Hierarchie lohnt, aber ich persönlich finde, dass APIs, die große Ausnahme heirarchies hinzufügen, die nur gehen werden printStackTrace()d oder angemeldet sein, sind nur eine Verschwendung von Aufwand.

Am Ende des Tages die Hauptsache ist, dass der Code eindeutig kommuniziert. Eine lokale Ausnahme Hierarchie wie lokaler Jargon ist -. Es Informationen für Insider fügt aber hinzu, kann Außen verblüffen

Was gegen null Überprüfung Ich würde behaupten, es Sinn macht. Erstens ermöglicht es Ihnen, eine Nachricht über hinzufügen, was null (dh Knoten oder Token), wenn Sie die Ausnahme konstruieren, die hilfreich sein würde. Zweitens in Zukunft möglicherweise eine Map Implementierung verwenden, die null ermöglicht, und dann würden Sie die Fehlerprüfung verlieren. Die Kosten sind so gut wie nichts, es sei denn, ein Profiler sagt es eine innere Schleife Problem ist, würde ich nicht darum kümmern.

Andere Tipps

Die Standard-Java-Ausnahme ist IllegalArgumentException. Einige werden NullPointerException werfen, wenn das Argument null ist, aber für mich NPE hat, dass „jemand vermasselt“ Konnotation, und Sie haben keine Kunden Ihrer API möchten Sie denken nicht wissen, was Sie tun.

Für die öffentlichen APIs, überprüfen Sie die Argumente und scheitern früh und sauber. Die Zeit / Kosten kaum von Bedeutung ist.

In Java würden Sie normalerweise eine Illegal werfen

Wenn Sie einen Leitfaden über wollen, wie gut Java-Code zu schreiben, kann ich empfehlen das Buch sehr Effective Java von Joshua Bloch.

Ich denke, eine Menge über den Vertrag des Verfahrens hängt und wie gut die Anrufer bekannt ist.

An einem gewissen Punkt in dem Prozess könnte der Anrufer Maßnahmen ergreifen, um den Knoten zu validieren, bevor Sie Ihre Methode aufrufen. Wenn Sie den Anrufer kennen und wissen, dass diese Knoten werden immer validiert dann denke ich, ist es ok zu übernehmen Sie gute Daten zu bekommen. Im Wesentlichen ist die Verantwortung für den Anrufer.

Allerdings, wenn Sie zum Beispiel einen Dritten Bibliothek bereitstellt, die dann verteilt wird, müssen Sie den Knoten für NULL-Werte, etcs zu validieren ...

Ein illegalArugementException ist der Java-Standard, sondern ist auch eine Runtime. Also, wenn Sie den Anrufer zu behandeln, die Ausnahme erzwingen wollen, dann müssen Sie einen Scheck Ausnahme vorgesehen ist, wahrscheinlich eine benutzerdefinierte, die Sie erstellen.

Ich persönlich würde gerne Nullpointerexceptions nur durch Zufall passieren, also etwas anderes verwendet werden, um anzuzeigen, dass ein illegaler Argument-Wert übergeben wurde. Illegal ist für diese Ordnung.

if (arg1 == null) {
 throw new IllegalArgumentException("arg1 == null");
}

Dies sollte sowohl für diejenigen, Lesen des Codes ausreichend sein, sondern auch die arme Seele, die eine Unterstützung Anruf bei 3 Uhr morgens wird.

(und immer einen erläuternden Text für Ihre Ausnahmen angeben, werden Sie ihnen etwas traurigen Tag schätzen)

wie die andere: java.lang.IllegalArgumentException. Über null Knoten überprüft, was die Überprüfung schlecht Eingang am Knoten Schöpfung?

Ich muss jemand nicht gefallen, also was ich jetzt als kanonisch Code

void method(String s) 

if((s != null) && (s instanceof String) && (s.length() > 0x0000))
{

, das wird mir viel Schlaf.

Andere werden nicht zustimmen.

scroll top