Возвращаемый ноль; необходимо, поскольку исключение может быть перехвачено, однако в таком случае, поскольку мы уже проверили, было ли оно нулевым (и предположим, что мы знаем, что вызываемый класс поддерживает клонирование), поэтому мы знаем, что оператор try никогда не завершится ошибкой.
Если вы знаете подробности о вводимых данных таким образом, чтобы вы знали, что tryутверждение никогда не может потерпеть неудачу, какой в нем смысл? Избегайтеtry если вы точно знаете, что всегда все будет успешно (хотя редко можно быть абсолютно уверенным на протяжении всего срока службы вашей кодовой базы).
В любом случае компилятор, к сожалению, не умеет читать мысли. Он видит функцию и ее входные данные, и, учитывая имеющуюся информацию, ему нужен этот returnоператор внизу, как и у вас.
Является ли плохой практикой помещать дополнительный оператор возврата в конце, чтобы удовлетворить синтаксис и избежать ошибок компиляции (с пояснением, что он не будет достигнут), или есть лучший способ закодировать что-то вроде этого, чтобы дополнительный оператор возврата не нужен?
Напротив, я бы посоветовал избегать любых предупреждений компилятора, например, даже если это стоит еще одной строчки кода. Не беспокойтесь здесь о количестве строк. Определите надежность функции с помощью тестирования, а затем двигайтесь дальше. Просто представьте, что вы можете пропустить это returnутверждение, представьте, что вы вернетесь к этому коду через год, а затем попытайтесь решить, returnне вызовет ли этот оператор внизу больше путаницы, чем какой-то комментарий с подробным описанием того, почему он был опущен из-за предположений, которые вы можете сделать о входных параметрах. Скорее всего, с returnзаявлением будет легче разобраться.
Тем не менее, конкретно об этой части:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Я думаю, что здесь есть что-то немного странное с мышлением об обработке исключений. Обычно вы хотите проглатывать исключения на сайте, где у вас есть что-то значимое, что вы можете сделать в ответ.
Вы можете думать о try/catchмеханизме транзакции. tryвнесение этих изменений, если они потерпят неудачу и мы перейдем в catchблок, сделайте это (что бы ни было в catchблоке) в ответ как часть процесса отката и восстановления.
В этом случае простая печать трассировки стека с последующим принудительным возвратом null - это не совсем подход к транзакции / восстановлению. Код передает ответственность за обработку ошибок всему коду, вызывающему getCloneвручную проверку на наличие сбоев. Вы могли бы предпочесть пойматьCloneNotSupportedException и преобразовать его в другую, более значимую форму исключения и выбросить это, но вы не хотите просто проглатывать исключение и возвращать нуль в этом случае, поскольку это не похоже на сайт восстановления транзакций.
В конечном итоге вы передадите вызывающим абонентам ответственность за ручную проверку и устранение сбоев таким образом, когда выброс исключения позволит избежать этого.
Это как если вы загружаете файл, это транзакция высокого уровня. У вас может быть try/catchтам. В процессе tryingзагрузки файла вы можете клонировать объекты. Если где-то в этой высокоуровневой операции (загрузка файла) происходит сбой, вы обычно хотите, чтобы исключения полностью возвращались в этот try/catchблок транзакции верхнего уровня, чтобы вы могли корректно восстановиться после сбоя при загрузке файла (будь то из-за ошибки клонирования или чего-то еще). Таким образом, мы обычно не хотим просто проглотить исключение в таком детализированном месте, как это, а затем вернуть null, например, поскольку это нарушит большую часть значения и цели исключений. Вместо этого мы хотим полностью распространить исключения на сайт, где мы сможем с ними справиться.
Objectпараметр. Еслиaэто не класс, поддерживающийcloneметод (или это определено вObject?), Или если во времяcloneметода возникает ошибка (или любая другая ошибка, о которой я не могу сейчас вспомнить), может быть сгенерировано исключение, и вы достигнете заявление о возврате.