2015-01-22 10 views
5

Thỉnh thoảng tôi thấy các nhà phát triển sử dụng các thư viện như Precava’s Preconditions để xác nhận hợp lệ các tham số cho các giá trị rỗng trong phần đầu của một phương thức. Làm thế nào là khác với việc nhận NPE trong thời gian chạy vì một ngoại lệ thời gian chạy xảy ra theo một trong hai cách?Làm thế nào để sử dụng thư viện kiểm tra nulls tốt hơn so với nhận NPE?

CHỈNH SỬA: Nếu có lý do chính đáng thì nhà phát triển không nên sử dụng thư viện để kiểm tra null trên tất cả các phương pháp không?

+0

Nó có thể là nếu bạn kiểm tra phía trước bạn đã không thực hiện bất kỳ công việc nào, làm việc mà bạn có thể phải quay trở lại hoặc để lại trong một trạng thái không nhất quán là một NPE được ném vào giữa công việc nói? –

+0

Ngoài ra, bạn có thể ném một ngoại lệ với ít nhất một số thông báo có ý nghĩa cho người dùng (ít nhất là tốt hơn nhiều so với một NullPointerException) –

+2

tham số null không luôn luôn dẫn đến NPE ngay lập tức. Ví dụ, nó có thể được đưa vào một số lĩnh vực hoặc bộ sưu tập và dẫn đến các lỗi khó điều tra –

Trả lời

4

Một số nguyên nhân như sau:

  • Ngăn chặn mã từ được chạy trước khi lần đầu tiên biến (mà có thể là null) là de-tham chiếu.
  • Bạn có thể có các thông báo lỗi tùy chỉnh, chẳng hạn như "myVar không có, tôi không thể tiếp tục" hoặc bất kỳ thông báo nào có liên quan trông đẹp hơn trong nhật ký và dễ theo dõi hơn. Một NPE bình thường sẽ ít có thể đọc được trong các bản ghi.
  • Khả năng đọc mã tốt hơn (có thể cho là) ​​vì một lập trình viên đọc mã này sẽ nhận ra ngay lập tức rằng các giá trị này được mong đợi là không null.

Cuối cùng, đó là vấn đề về khẩu vị IMO. Tôi đã thấy các chương trình vốn không an toàn và không yêu cầu trước điều kiện.

+2

Không ai nên đánh giá thấp giá trị của thông báo lỗi tùy chỉnh. – biziclop

+0

Đã thêm câu hỏi tiếp theo dựa trên câu trả lời. Lặp lại câu hỏi ở đây: nếu có lý do chính đáng thì các nhà phát triển không nên sử dụng thư viện để kiểm tra null trên tất cả các phương pháp? – Glide

+2

Nói chung, chỉ có các phương pháp được sử dụng để kiểm tra đối số "bên ngoài". Một khi bạn đang ở trong mã bạn kiểm soát, đặc biệt là các phương thức riêng tư, bạn có thể tự chứng minh rằng các đối số phải không có giá trị (và tất nhiên là đúng theo các cách liên quan khác). Quy tắc chung của tôi là bất kỳ phương thức công khai hoặc hàm tạo nào luôn được kiểm tra đối số. – isomeme

4

Có nhiều lý do khác nhau. Một phần lớn, như đã đề cập trong các ý kiến, là để kiểm tra được thực hiện trước khi bất kỳ công việc được thực hiện. Nó cũng không phải là không phổ biến cho một phương thức để có một đường dẫn mã trong đó một tham số cụ thể không bao giờ bị bỏ qua, trong trường hợp không kiểm tra trước, các cuộc gọi không hợp lệ đến phương thức đôi khi không tạo ra ngoại lệ. Mục đích là để đảm bảo chúng luôn luôn tạo ra một ngoại lệ để lỗi đó bị bắt ngay lập tức. Điều đó nói rằng, tôi không nhất thiết phải sử dụng checkNotNull nếu tôi sẽ ngay lập tức dereference tham số trên dòng tiếp theo hoặc một cái gì đó. Ngoài ra còn có trường hợp của các nhà thầu, nơi bạn muốn checkNotNull trước khi gán một tham số cho một trường, nhưng tôi không nghĩ đó là những gì bạn đang nói về vì bạn đang nói về các phương thức mà thông số sẽ được sử dụng dù sao.

+1

Một trong những nguyên tắc phần mềm yêu thích của tôi là "Thất bại sớm, thất bại". Bắt và báo cáo một đối số xấu càng sớm càng tốt giúp chẩn đoán và gỡ lỗi dễ dàng hơn nhiều. – isomeme

Các vấn đề liên quan