Như bạn có thể thấy, có sự không đồng ý cho dù một NPE hoặc một số ngoại lệ khác phải được ném .
Nếu bạn chấp nhận rằng một NPE là thích hợp hơn so với các lựa chọn thay thế, và đây là một tình huống mà null
là dứt khoát không chính xác, sau đó:
- nó là tốt hơn để ném NPE sớm; tức là trong nhà xây dựng và
- thì tốt hơn là hãy ném nó bằng thông báo ngoại lệ tùy chỉnh; tức là không phải là
null
như xảy ra khi JVM ném NPE.
Trong ngữ cảnh đó sử dụng Objects.requireNonNull
là thực tế tốt.
Bạn cũng có thể sử dụng khẳng định Java cho điều này, nhưng bạn cần phải thực hiện một phán quyết về việc liệu nó là một điều tốt hay xấu mà các thử nghiệm thể được tắt. Bạn phải xem xét liệu lợi ích hiệu suất của việc bật kiểm tra sớm có vượt quá những vấn đề có thể xảy ra do không kiểm tra trước đó hay không. Ví dụ, giả sử bạn thấy một NPE trong sản xuất với các xác nhận bị tắt ... và bạn không thể chẩn đoán nó. Bạn có bật xác nhận không? Các xác nhận có thay đổi hành vi của mã không? Nó sẽ làm chậm hệ thống của bạn xuống (do rất nhiều kiểm tra xác nhận khác)? Tình huống đã kích hoạt NPE có khả năng tái diễn?
(lỗi liên quan đến luồng thường là "một lần trong mặt trăng xanh" những thứ cực kỳ khó tái tạo. Tôi cho rằng bạn cần thông tin để chẩn đoán sự cố BẤT K time thời gian xảy ra ... không chỉ khi bạn đã bật tính năng kiểm tra xác nhận.)
Đối số tương thích ngược có thể có liên quan. Tuy nhiên, theo nguyên tắc chung, bạn không viết mã của mình để chạy trên các nền tảng Java cũ. Nếu bạn có yêu cầu cụ thể để hỗ trợ các phiên bản Java cũ ... thì điều đó khác. Nhưng nếu đó là trường hợp, bạn không nên làm phát triển của bạn chống lại các API Java 7 ở tất cả ... do đó trình biên dịch/IDE của bạn nên gắn cờ các lớp Objects
là lỗi biên dịch.
(Hạn chế bản thân chỉ sử dụng các API cũ hơn khi bạn không cần phải làm cho chất lượng mã của bạn bị ảnh hưởng và làm cho nó "lỗi thời" trước đó. dễ dàng hơn để viết đáng tin cậy/ứng dụng duy trì Cố ý không sử dụng nó là ... ngoan cố Hãy tưởng tượng nếu bạn hạn chế bản thân để Java 1.1 ...)
1 -.. FWIW, tôi nghĩ NPE của là tốt. Và NPE với thông điệp cụ thể hơn (nói) IllegalArgumentException
và có rất nhiều tiền lệ trong thư viện lớp chuẩn Java cho các nhà xây dựng, v.v ... được ghi lại khi ném NPE. Bên cạnh đó, phương pháp này được thiết kế rõ ràng để sử dụng theo cách này.
Nguồn
2013-05-07 22:41:02
Điều đó tùy thuộc. Bạn có muốn một ngoại lệ ném vào constructor của bạn? – Reimeus
Trên thực tế, nếu ngoại lệ không được ném vào hàm tạo, nó chắc chắn sẽ bị ném bằng cách gọi các phương thức của lớp này. Mục đích của việc này là: tôi nên trực tiếp ngăn người dùng xây dựng ("Hãy cẩn thận một số đối tượng là null, do đó bạn sẽ không thể thực hiện một số phương thức") hoặc tôi để anh ta ném ngoại lệ này (nếu anh ta gọi một số phương pháp của lớp)? – user2336315
Tôi đã sử dụng mẫu Builder ở đây và, như Ravi đề xuất dưới đây, ném IllegalArgumentException (hoặc IllegalStateException.) – Marvo