556 Stimmen

Sollte eine Abrufmethode 'null' zurückgeben oder eine Ausnahme auslösen, wenn sie den Rückgabewert nicht erzeugen kann?

Ich benutze die Java-Sprache, ich habe eine Methode, die ein Objekt zurückgeben soll, wenn es gefunden wird.

Wenn es nicht gefunden wird, sollte ich:

  1. null zurückgeben
  2. eine Ausnahme werfen
  3. anderes

Was ist die beste Praxis oder das beste Idiom?

65 Stimmen

Was auch immer du tust, stelle sicher, dass du es dokumentierst. Ich denke, dieser Punkt ist wichtiger als die genaue Methode, die "am besten" ist.

7 Stimmen

Dies hängt von den vorherrschenden Idiomen der Programmiersprache ab. Bitte taggen Sie diese Frage mit einem Programmiersprachen-Tag.

4 Stimmen

Das Zurückgeben von null kann nur Erfolg oder Misserfolg bedeuten, was oft nicht viel Information ist (manche Methoden können auf viele Arten fehlschlagen). Libraries sollten lieber Ausnahmen werfen, um Fehler explizit zu machen und auf diese Weise kann das Hauptprogramm entscheiden, wie der Fehler auf einer höheren Ebene zu behandeln ist (im Gegensatz zur integrierten Fehlerbehandlungslogik).

530voto

Ken Punkte 2064

Wenn Sie immer erwarten, einen Wert zu finden, werfen Sie die Ausnahme, wenn er fehlt. Die Ausnahme würde bedeuten, dass es ein Problem gab.

Wenn der Wert fehlen oder vorhanden sein kann und beides gültig für die Anwendungslogik ist, geben Sie null zurück.

Wichtiger: Was tun Sie an anderen Stellen im Code? Konsistenz ist wichtig.

113voto

Carlton Jenke Punkte 2915

Werfen Sie nur eine Ausnahme, wenn es wirklich ein Fehler ist. Wenn es erwartetes Verhalten ist, dass das Objekt nicht existiert, geben Sie das Null zurück.

Ansonsten ist es eine Frage der Präferenz.

87voto

Matias Nino Punkte 4223

Als Faustregel gilt: Wenn die Methode immer ein Objekt zurückgeben soll, dann wähle die Ausnahme. Wenn du gelegentlich mit Nullwerten rechnest und diese auf eine bestimmte Weise behandeln möchtest, wähle Null.

Was auch immer du tust, ich rate dringend von der dritten Option ab: Eine Zeichenfolge zurückzugeben, die "WTF" sagt.

52voto

Kevin Gale Punkte 4150

Wenn null niemals einen Fehler anzeigt, dann einfach null zurückgeben.

Wenn null immer ein Fehler ist, dann wirf eine Ausnahme.

Wenn null manchmal eine Ausnahme ist, dann codiere zwei Routinen. Eine Routine wirft eine Ausnahme und die andere ist eine boolesche Testroutine, die das Objekt in einem Ausgabeparameter zurückgibt und false zurückgibt, wenn das Objekt nicht gefunden wurde.

Es ist schwer, eine Try-Routine falsch zu verwenden. Es ist wirklich einfach, darauf zu vergessen, null zu überprüfen.

Also, wenn null ein Fehler ist, schreib einfach

object o = FindObject();

Wenn das Null kein Fehler ist, kannst du etwas wie folgt codieren

if (TryFindObject(out object o)
  // Etwas mit o machen
else
  // o wurde nicht gefunden

27voto

Lena Schimmel Punkte 7094

Ich wollte nur die zuvor genannten Optionen zusammenfassen und einige neue hinzufügen:

  1. null zurückgeben
  2. eine Ausnahme werfen
  3. das Null-Objekt-Muster verwenden
  4. einen booleschen Parameter für deine Methode bereitstellen, damit der Aufrufer wählen kann, ob du eine Ausnahme werfen sollst
  5. einen zusätzlichen Parameter bereitstellen, damit der Aufrufer einen Wert festlegen kann, den er zurückbekommt, wenn kein Wert gefunden wird

Oder Sie können diese Optionen kombinieren:

Bieten Sie mehrere überladene Versionen Ihres Getters an, damit der Aufrufer entscheiden kann, welchen Weg er gehen möchte. In den meisten Fällen hat nur die erste Implementierung des Suchalgorithmus, und die anderen umschließen nur die erste:

Object findObjectOrNull(String Schlüssel);
Object findObjectOrThrow(String Schlüssel) wirft SomeException;
Object findObjectOrCreate(String Schlüssel, SomeClass DatenZurErstellungDesNeuenObjekts);
Object findObjectOrDefault(String Schlüssel, Object Standardrückgabewert);

Auch wenn Sie sich entscheiden, nur eine Implementierung anzubieten, möchten Sie möglicherweise eine Namenskonvention wie diese verwenden, um Ihren Vertrag zu klären. Es hilft Ihnen, falls Sie sich jemals entscheiden sollten, weitere Implementierungen hinzuzufügen.

Sie sollten es nicht überstrapazieren, aber es kann hilfreich sein, insbesondere wenn Sie eine Hilfsklasse schreiben, die Sie in Hunderten von verschiedenen Anwendungen mit vielen verschiedenen Fehlerbehandlungskonventionen verwenden werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X