Zwrot null; jest konieczne, ponieważ wyjątek może zostać przechwycony, jednak w takim przypadku, ponieważ już sprawdziliśmy, czy jest on pusty (i załóżmy, że wiemy, że klasa, którą wywołujemy, obsługuje klonowanie), więc wiemy, że instrukcja try nigdy nie zawiedzie.
Jeśli znasz szczegóły dotyczące danych wejściowych w taki sposób, że wiesz, że try
stwierdzenie nigdy nie zawiedzie, jaki jest sens jego posiadania? Unikaj tego, try
jeśli wiesz na pewno, że wszystko zawsze się powiedzie (choć rzadko można mieć całkowitą pewność przez cały okres istnienia kodu).
W każdym razie kompilator niestety nie jest czytnikiem w myślach. Widzi funkcję i jej dane wejściowe, a biorąc pod uwagę posiadane informacje, potrzebuje tego return
oświadczenia na dole, tak jak masz.
Czy jest złą praktyką umieszczanie dodatkowej instrukcji return na końcu tylko po to, aby spełnić składnię i uniknąć błędów kompilacji (z komentarzem wyjaśniającym, że nie zostanie osiągnięty), czy też jest lepszy sposób na zakodowanie czegoś takiego, aby dodatkowe instrukcja zwrotu jest niepotrzebna?
Wręcz przeciwnie, sugerowałbym dobrą praktykę unikanie jakichkolwiek ostrzeżeń kompilatora, np. Nawet jeśli kosztuje to kolejną linię kodu. Nie martw się tutaj zbytnio o liczbę linii. Ustal niezawodność funkcji poprzez testowanie, a następnie przejdź dalej. Po prostu udając, że możesz pominąć return
stwierdzenie, wyobraź sobie, że wracasz do tego kodu rok później, a następnie spróbuj zdecydować, czy to return
stwierdzenie na dole spowoduje więcej zamieszania niż komentarz szczegółowo wyjaśniający, dlaczego zostało pominięte z powodu przypuszczeń, które możesz zrobić o parametrach wejściowych. Najprawdopodobniej return
łatwiej będzie sobie z tym poradzić.
To powiedziawszy, szczególnie w tej części:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Myślę, że jest coś nieco dziwnego w podejściu do obsługi wyjątków. Zwykle chcesz połknąć wyjątki w witrynie, w której masz coś znaczącego, co możesz zrobić w odpowiedzi.
Możesz myśleć o try/catch
mechanizmie transakcji.try
dokonanie tych zmian, jeśli zawiodą i rozgałęzimy się do catch
bloku, zrób to (cokolwiek jest w catch
bloku) w odpowiedzi jako część procesu wycofywania i odzyskiwania.
W tym przypadku samo wydrukowanie śladu stosu, a następnie zmuszenie do zwrócenia wartości null nie jest dokładnie nastawieniem do transakcji / odzyskiwania. Kod przenosi odpowiedzialność za obsługę błędów na wszystkie wywołania kodugetClone
celu ręcznego sprawdzenia błędów. Możesz chcieć przechwycić CloneNotSupportedException
i przetłumaczyć go na inną, bardziej znaczącą formę wyjątku i wyrzucić go, ale nie chcesz po prostu połykać wyjątku i zwracać null w tym przypadku, ponieważ nie jest to witryna odzyskiwania transakcji.
Skończysz z wyciekiem obowiązków na dzwoniących, aby ręcznie sprawdzić i poradzić sobie z awarią w ten sposób, gdy rzucenie wyjątku pozwoliłoby tego uniknąć.
To tak, jakbyś załadował plik, to transakcja wysokiego poziomu. Możesz try/catch
tam mieć . Podczas trying
ładowania pliku można klonować obiekty. Jeśli wystąpi awaria w dowolnym miejscu tej operacji wysokiego poziomu (ładowania pliku), zazwyczaj chcesz zgłosić wyjątki z powrotem do tego try/catch
bloku transakcji najwyższego poziomu , aby można było bezpiecznie odzyskać sprawność po niepowodzeniu ładowania pliku (niezależnie od tego, czy jest to z powodu błędu w klonowaniu lub czegokolwiek innego). Dlatego generalnie nie chcemy po prostu wchłaniać wyjątku w takim szczegółowym miejscu, jak to, a następnie zwracać wartość null, np. Ponieważ podważyłoby to wiele wartości i celu wyjątków. Zamiast tego chcemy propagować wyjątki z powrotem do witryny, w której możemy w znaczący sposób sobie z tym poradzić.
Object
parametr. Jeślia
nie jest klasą, która obsługujeclone
metodę (lub jest to zdefiniowane wObject
?) Lub jeśli wystąpi błąd podczasclone
metody (lub jakikolwiek inny błąd, o którym nie mogę teraz pomyśleć), może zostać wyrzucony wyjątek i osiągniesz instrukcja zwrotu.