Trả về null; là cần thiết vì một ngoại lệ có thể bị bắt, tuy nhiên trong trường hợp như vậy vì chúng tôi đã kiểm tra xem nó có phải là null hay không (và giả sử rằng chúng tôi biết lớp mà chúng tôi đang gọi hỗ trợ nhân bản) nên chúng tôi biết câu lệnh try sẽ không bao giờ thất bại.
Nếu bạn biết chi tiết về các yếu tố đầu vào liên quan theo cách mà bạn biết rằng try
câu lệnh không bao giờ có thể thất bại, bạn có nó thì có ích gì? Tránhtry
nếu bạn biết chắc chắn rằng mọi thứ sẽ luôn thành công (mặc dù hiếm khi bạn có thể hoàn toàn chắc chắn trong suốt thời gian tồn tại của codebase).
Trong mọi trường hợp, đáng tiếc là trình biên dịch không phải là trình đọc tâm trí. Nó nhìn thấy chức năng và các đầu vào của nó, và cung cấp thông tin mà nó có, nó cần return
câu lệnh đó ở dưới cùng khi bạn có nó.
Có phải thực tế không tốt khi đặt thêm câu lệnh return ở cuối chỉ để đáp ứng cú pháp và tránh lỗi biên dịch (với một chú thích giải thích nó sẽ không đạt được), hoặc có cách nào tốt hơn để viết mã một cái gì đó như thế này để bổ sung câu lệnh return là không cần thiết?
Hoàn toàn ngược lại, tôi khuyên bạn nên tránh bất kỳ cảnh báo trình biên dịch nào, ví dụ: ngay cả khi điều đó tốn một dòng mã khác. Đừng lo lắng quá nhiều về số lượng dòng ở đây. Thiết lập độ tin cậy của chức năng thông qua thử nghiệm và sau đó tiếp tục. Chỉ giả vờ rằng bạn có thể bỏ qua return
câu lệnh, hãy tưởng tượng quay lại đoạn mã đó một năm sau và sau đó cố gắng quyết định xem return
câu lệnh đó ở phía dưới có gây ra nhầm lẫn hơn một số nhận xét nêu chi tiết về lý do tại sao nó bị bỏ qua vì những giả định bạn có thể thực hiện về các tham số đầu vào. Rất có thểreturn
tuyên bố sẽ dễ xử lý hơn.
Điều đó nói, cụ thể về phần này:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Tôi nghĩ rằng có điều gì đó hơi kỳ lạ với tư duy xử lý ngoại lệ ở đây. Bạn thường muốn nuốt các ngoại lệ tại một trang web mà bạn có điều gì đó có ý nghĩa mà bạn có thể làm để đáp lại.
Bạn có thể try/catch
coi đây là một cơ chế giao dịch. try
thực hiện những thay đổi này, nếu chúng không thành công và chúng tôi phân nhánh vào catch
khối, hãy thực hiện việc này (bất cứ thứ gì trong catch
khối) để đáp ứng như một phần của quá trình khôi phục và khôi phục.
Trong trường hợp này, việc chỉ in một stacktrace và sau đó buộc phải trả về null không chính xác là một tư duy giao dịch / khôi phục. Mã chuyển trách nhiệm xử lý lỗi cho tất cả các lệnh gọi mã getClone
để kiểm tra lỗi theo cách thủ công. Bạn có thể thích nắm bắtCloneNotSupportedException
và dịch nó thành một dạng ngoại lệ khác, có ý nghĩa hơn và ném nó đi, nhưng bạn không muốn đơn giản nuốt ngoại lệ và trả về giá trị rỗng trong trường hợp này vì đây không giống như một trang khôi phục giao dịch.
Bạn sẽ kết thúc việc giao trách nhiệm cho người gọi để kiểm tra thủ công và xử lý lỗi theo cách đó, khi đưa ra một ngoại lệ sẽ tránh được điều này.
Nó giống như nếu bạn tải một tệp, đó là giao dịch cấp cao. Bạn có thể có một try/catch
ở đó. Trong quá trình trying
tải tệp, bạn có thể sao chép các đối tượng. Nếu có lỗi xảy ra ở bất kỳ đâu trong hoạt động cấp cao này (tải tệp), bạn thường muốn ném các ngoại lệ trở lại try/catch
khối giao dịch cấp cao nhất này để bạn có thể khôi phục một cách duyên dáng sau lỗi khi tải tệp (cho dù đó là do lỗi nhân bản hoặc bất cứ điều gì khác). Vì vậy, chúng tôi thường không muốn chỉ nuốt một ngoại lệ ở một số nơi cụ thể như thế này và sau đó trả về giá trị rỗng, ví dụ, vì điều đó sẽ đánh bại rất nhiều giá trị và mục đích của ngoại lệ. Thay vào đó, chúng tôi muốn tuyên truyền các ngoại lệ trở lại một trang web mà chúng tôi có thể xử lý nó một cách có ý nghĩa.
Object
tham số. Nếua
không phải là một lớp hỗ trợclone
phương thức (hoặc điều này được định nghĩa trongObject
?) Hoặc nếu một lỗi xảy ra trongclone
phương thức (hoặc bất kỳ lỗi nào khác mà tôi không thể nghĩ ra ngay bây giờ), một Ngoại lệ có thể được ném ra và bạn sẽ đạt được câu lệnh trả về.