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 tryAnweisung niemals fehlschlagen kann, wozu ist sie dann sinnvoll? Vermeiden Sie das, trywenn 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 returnAnweisung 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. returnStellen 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 returnAussage 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 returnwird 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/catcheinen Transaktionsmechanismus vorstellen. tryWenn diese Änderungen fehlschlagen und wir in den catchBlock verzweigen , tun Sie dies (was auch immer im catchBlock 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, getCloneum manuell nach Fehlern zu suchen. Möglicherweise möchten Sie die CloneNotSupportedExceptionAusnahme 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/catchdort haben. Während des tryingLadens 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/catchdamit 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.
ObjectParameter. Wennaes sich nicht um eine Klasse handelt, die diecloneMethode unterstützt (oder ist dies in definiertObject?) Oder wenn während dercloneMethode 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.