Die Rückgabe null; Dies ist erforderlich, da möglicherweise eine Ausnahme abgefangen wird. In einem solchen Fall haben wir jedoch bereits überprüft, ob sie null ist (und wir nehmen an, dass die von uns aufgerufene Klasse das Klonen unterstützt), sodass wir wissen, dass die try-Anweisung niemals fehlschlagen wird.
Wenn Sie Details zu den Eingaben so kennen, dass Sie wissen, dass die try
Anweisung niemals fehlschlagen kann, wozu ist sie dann sinnvoll? Vermeiden Sie das, try
wenn Sie sicher sind, dass die Dinge immer erfolgreich sein werden (obwohl es selten vorkommt, dass Sie während der gesamten Lebensdauer Ihrer Codebasis absolut sicher sein können).
In jedem Fall ist der Compiler leider kein Gedankenleser. Es sieht die Funktion und ihre Eingaben und benötigt angesichts der Informationen, die es hat, diese return
Anweisung unten, so wie Sie sie haben.
Ist es eine schlechte Praxis, die zusätzliche return-Anweisung am Ende einzufügen, um die Syntax zu erfüllen und Kompilierungsfehler zu vermeiden (mit einem Kommentar, der erklärt, dass sie nicht erreicht werden), oder gibt es eine bessere Möglichkeit, so etwas so zu codieren, dass das Extra return-Anweisung ist nicht erforderlich?
Im Gegenteil, ich würde empfehlen, Compiler-Warnungen zu vermeiden, z. B. auch wenn dies eine weitere Codezeile kostet. Sorgen Sie sich hier nicht zu sehr um die Anzahl der Zeilen. Stellen Sie die Zuverlässigkeit der Funktion durch Testen fest und fahren Sie dann fort. return
Stellen Sie sich vor, Sie könnten die Aussage weglassen , stellen Sie sich vor, Sie würden ein Jahr später auf diesen Code zurückkommen, und versuchen dann zu entscheiden, ob diese return
Aussage unten mehr Verwirrung stiftet als ein Kommentar, in dem die Details aufgeführt sind, warum sie aufgrund möglicher Annahmen weggelassen wurde Machen Sie über die Eingabeparameter. Höchstwahrscheinlich return
wird es einfacher sein, mit der Aussage umzugehen.
Das heißt, speziell zu diesem Teil:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
//cant be reached, in for syntax
return null;
Ich denke, dass die Einstellung zur Ausnahmebehandlung hier etwas seltsam ist. Im Allgemeinen möchten Sie Ausnahmen an einer Stelle schlucken, an der Sie etwas Sinnvolles haben, das Sie als Antwort tun können.
Sie können sich try/catch
einen Transaktionsmechanismus vorstellen. try
Wenn diese Änderungen fehlschlagen und wir in den catch
Block verzweigen , tun Sie dies (was auch immer im catch
Block enthalten ist) als Reaktion auf den Rollback- und Wiederherstellungsprozess.
In diesem Fall ist das bloße Drucken eines Stacktraces und das anschließende Zurückgeben von Null nicht gerade eine Transaktions- / Wiederherstellungs-Denkweise. Der Code überträgt die Verantwortung für die Fehlerbehandlung auf alle Code-Aufrufe, getClone
um manuell nach Fehlern zu suchen. Möglicherweise möchten Sie die CloneNotSupportedException
Ausnahme lieber abfangen und in eine andere, aussagekräftigere Form der Ausnahme übersetzen und diese auslösen. In diesem Fall möchten Sie die Ausnahme jedoch nicht einfach verschlucken und eine Null zurückgeben, da dies nicht wie eine Transaktionswiederherstellungssite ist.
Sie verlieren am Ende die Verantwortung für die Anrufer, Fehler manuell zu überprüfen und auf diese Weise zu behandeln, wenn das Auslösen einer Ausnahme dies vermeiden würde.
Wenn Sie eine Datei laden, ist dies die Transaktion auf hoher Ebene. Sie könnten eine try/catch
dort haben. Während des trying
Ladens einer Datei können Sie Objekte klonen. Wenn irgendwo in dieser übergeordneten Operation (Laden der Datei) ein Fehler auftritt, möchten Sie normalerweise Ausnahmen bis zu diesem Transaktionsblock der obersten Ebene zurückwerfen, try/catch
damit Sie einen Fehler beim Laden einer Datei ordnungsgemäß beheben können (unabhängig davon, ob dies der Fall ist) aufgrund eines Fehlers beim Klonen oder irgendetwas anderem). Daher möchten wir im Allgemeinen nicht einfach eine Ausnahme an einer bestimmten Stelle wie dieser verschlucken und dann eine Null zurückgeben, z. B. da dies einen Großteil des Werts und Zwecks von Ausnahmen zunichte machen würde. Stattdessen möchten wir Ausnahmen bis zu einer Site weitergeben, an der wir sinnvoll damit umgehen können.
Object
Parameter. Wenna
es sich nicht um eine Klasse handelt, die dieclone
Methode unterstützt (oder ist dies in definiertObject
?) Oder wenn während derclone
Methode ein Fehler auftritt (oder ein anderer Fehler, an den ich momentan nicht denken kann), könnte eine Ausnahme ausgelöst werden und Sie würden erreichen die return-Anweisung.