Câu trả lời này có thể dài nhưng tôi nghĩ nó đáng giá.
Dường như không có ý tưởng hay để nắm bắt một nhận dạng nullpointerexception.
Bạn nói đúng, bạn không nên bắt NullPointerException, cũng như bất kỳ ngoại lệ thời gian chạy nào.
Nếu trường hợp đó xảy ra, tại sao nó được phương pháp đưa ra? Nếu nó chỉ bị bắt với ngoại lệ?
Nó được sử dụng để chỉ ra lỗi lập trình đã được tìm thấy.Các lỗi lập trình này có thể và phải được sửa bằng mã (Có nghĩa là chúng có thể ngăn ngừa được)
Ngoài ra, nếu tôi gặp phải tham số rỗng cách xử lý? [...] (giả sử không ném npe)?
Tùy thuộc vào những gì bạn muốn làm. Đối với một số logic, giá trị null
có thể được cho phép. Nếu đó là trường hợp, bạn xác nhận sự hiện diện của null và làm một cái gì đó về nó, hoặc là cung cấp một giá trị mặc định hoặc tránh gửi messaged đến null.
Ví dụ: Giả sử bạn có hệ thống thông tin thanh toán và bạn có mã này nơi bạn lưu thông tin khách hàng và bạn có thể tùy ý lưu thông tin bổ sung của khách hàng.
Trong trường hợp này, thông báo tùy chọn có thể là rỗng và mã của bạn phải xác thực sự hiện diện của nó.
Ví dụ:
/**
* ...
* @param - OptionalMessage may be null, include anything else you wan to save.
*/
public void sendCustomerInformation(Customer c , OptionalMessage optionalMessage) {
SomeMessage message = SomeMessage.createMessage();
message.setHeader(c.name());
message.setCustomerInformation(c);
if(optionalMessage != null) { // is optional? handle it
message.add(optionalMessage.status());
message.add(optionalMessage.summary());
message.add(optionalMessage.message());
}
}
}
Bạn xác nhận sự hiện diện của vô tài liệu đó.
Nhưng mã này cùng cũng có một khách hàng như tham số, trong trường hợp này bạn có thể:
a) Không làm gì b) Validate nó cũng c) Ném một ngoại lệ khác nhau tùy theo mức độ trừu tượng ở cấp độ này.
Ví dụ: mã trên, không a) không có gì. Điều này sẽ dẫn đến một NullPointerException nơi mã số c.name()
được gọi, và điều này sẽ được nắm bắt sớm trong các bài kiểm tra phát triển. Ngoài ra, nó nên được ghi lại, trong param và ném trong javadoc.
/**
* ...
* @param c - The customer whose information is to be sent. NotNull
* ...
* @throws NullPointerException if the customer is null
*/
public void sendCustomerInformation(Customer c , OptionalMessage optionalMessage) {
SomeMessage message = SomeMessage.createMessage();
...
Nếu ai đó gọi phương thức này bằng không, thì Npe sẽ cho biết họ đã mã hóa điều gì đó sai. Thêm vào đó, Npe, sẽ nói rất nhanh những gì và nơi các lỗi mã hóa được (khi gọi sendCustomerInformation
với khách hàng null.
tùy chọn b) Xác nhận nó. Nó có thể là trường hợp, khi bạn có thể cho phép xử lý một khách hàng rỗng (nó không có ý nghĩa nhưng, nó là một tùy chọn)
Trong trường hợp này bạn có thể xác nhận nó và trả lại sớm (trong I) đang thực hiện thời trang)
public void sendCustomerInformation(Customer c , OptionalMessage optionalMessage) {
if(cusomer == null) { return; // I'm done! }
// else
SomeMessage message = ...
..
}
Hoặc có thể tạo ra một sự thay thế:
public void sendCustomerInformation(Customer c , OptionalMessage optionalMessage) {
if(cusomer == null) { c = new EmptyCustomer() ;}
// else
SomeMessage message = ...
..
}
tùy chọn c) này cũng tương tự như vậy, nhưng, trong trường hợp này bạn ném ngoại lệ theo mức độ trừu tượng.Ví dụ, nếu điều này sẽ được hiển thị cho người sử dụng cuối cùng trong một giao diện hoặc một cái gì đó, nó có thể không có ý nghĩa để chỉ ném NPE:
public void sendCustomerInformation(Customer c , OptionalMessage optionalMessage) {
if(cusomer == null) {
// oh oh something went wrong.
log.fatal("Invalid argument on \"sendCustomerInformation\");
throw new MyApplicationException("Dear customer, the information yada yaa");
}
...
Nếu đây là một số loại nhà nước invalida trong ứng dụng:
public void sendCustomerInformation(Customer c , OptionalMessage optionalMessage) {
if(cusomer == null) {
// wait a minute, how could... why did.. what?
throw new IllegalStateException("Hey, I got null on sendCustomerInformation and this shouldn't happen");
}
...
Vì có thể ứng dụng chịu trách nhiệm giữ đối tượng/thông số đó ở dạng hợp lệ.
Kết luận
Vì vậy, nó phụ thuộc vào kịch bản, nhưng về tổng quát, một NullPointerException (và hầu hết RuntimeExceptions) cho thấy một cái gì đó mà có thể được cố định với mã (đó là một sai lầm lập trình viên) và bạn luôn có thể làm một cái gì đó về nó. Có những trường hợp bạn không thể làm điều gì đó về nó, điều tốt nhất bạn có thể làm là để cho nó bật lên.
Tôi hy vọng điều này sẽ hữu ích.
Xem thêm: Exception other than RuntimeException
Chuỗi không phải là loại nguyên thủy, fyi. – fmucar
Chuỗi có thể là null, nhưng một kiểu nguyên thủy như 'int' không thể. –
Nó được ném bởi các phương thức bởi vì ai đó (đọc: bạn) đang chuyển các giá trị null cho nó. Tốt nhất bạn nên tránh null vào mọi lúc, và/hoặc phân tán ứng dụng của bạn bằng các kiểm tra rỗng. Thích sử dụng các chuỗi rỗng, mẫu đối tượng Null và ngược lại. – fwielstra