Ist es möglich, zu verhindern, dass Try Catch Null zurückgibt?
-
21-12-2019 - |
Frage
Wenn jemand meine Methode aufruft, möchte ich das Problem defensiv angehen.Normalerweise komme ich einfach zurück null
.
Ich habe beschlossen, a zu implementieren try
catch
aber es sieht so aus, als würde ich einfach zurückkommen null
Trotzdem.
Kann ich meine schreiben? try
catch
so, dass sie am Ende der Methode nicht zurückkehrt null
?
Beispielcode, mit peek
auf einer Stack-Klasse.
public T peek()
{
T temp = null;
try
{
temp = array[size];
}
catch(Exception e)
{
}
return temp;
}
Beim Aufruf mit leerem Stapel.Es wird zurückkehren null
.
Also sollte ich mich überhaupt darum kümmern try
catch
für so einen Fall?Ich bin versucht, Folgendes zu tun:
if(isEmpty())
return null;
Wenn der Stapel nicht leer ist, möchte ich das Element zurückgeben.Wenn der Stapel Ist empty kann ich dann vermeiden, null zurückzugeben, wenn ich das verwende try-catch
?
Lösung
Die Methode muss etwas zurückgeben oder eine Ausnahme auslösen.Wenn Sie einen unbegrenzten generischen Typ haben, können Dinge wie Nullobjektmuster nicht verwendet werden, sodass die Optionen zurückgegeben werden null
, etwas zurückgeben, das enthält T
wie Optional<T>
, oder eine Ausnahme auslösen.
Wenn Ihnen die Sicherheit von nicht gefällt null
, können Sie verwenden Optional
, entweder aus Java 8 oder einer Bibliothek.Geprüfte Ausnahmen haben eine ähnliche Sicherheit, sind hier jedoch ungeeignet.
Andere Tipps
So würde ich das Problem angehen.Durch das Auslösen einer Ausnahme in der Peek-Funktion wird dem Aufrufer die Pflicht übertragen, diese Ausnahme zu behandeln.Warum?Weil ich möchte, dass ein Fehler eine möglichst große Explosion verursacht.Auch die Peek-Methode wurde kleiner.Wie Sie bereits zustimmen, ist die Rückgabe von null lahm.
public T peek() throws IndexOutOfBoundsException
{
return array[size];
}
Und
try
{
T top = thestack.peek();
/* Do something with that object */
}
catch(IndexOutOfBoundsException e)
{
/* Do something else */
}
Das kann man sich kaum vorstellen array[size]
Es wird eine Ausnahme ausgelöst, es sei denn, das Array ist null oder die Größe liegt außerhalb der Länge des Arrays.Sie könnten also so etwas tun:
if (array != null && array.length > size) {
return array[size - 1]; // assuming your size starts at 1
}
return null; // need to return something, if not null you need an option type.
Bearbeiten
Oder mit einem Möglichkeit Monade - und so etwas wie,
if (array != null && array.length > size) {
return new Some<T>(array[size - 1]); // assuming your size starts at 1
}
return new None<T>();