2010-03-01 1 views
10

Mã của tôi là phá vỡ trên dòng sau đây với một NullPointerException:Tại sao tôi nhận được một NullPointerException khi so sánh một String với null?

if (stringVariable.equals(null)){ 

Trước tuyên bố này, tôi tuyên bố stringVariable và đặt nó vào một lĩnh vực cơ sở dữ liệu.

Trong tuyên bố này, tôi đang cố gắng phát hiện xem trường có giá trị null không, nhưng tiếc là nó bị hỏng!

Mọi suy nghĩ?

+0

Bạn đang gọi phương thức trên biến chứa null. 'equals()' không phải là đặc biệt, nó vẫn sẽ ném một NPE. –

Trả lời

28

Sử dụng

stringVariable == null 

Để kiểm tra xem stringVariablenull.

Phương thức equals (và mọi phương thức khác) yêu cầu stringVariable không được null.

5

Nó không bao giờ khôn ngoan để gọi một phương pháp, có thể bằng() hoặc nếu không, trên một biến có thể là null. Đó là lý do tại sao người ta thường làm điều gì đó như:

if (var != null && var.method(something)) { 
    // var.method() was true 
} else { 
    // var is null or var.method is false 
} 

Trong trường hợp đặc biệt của bạn nó sẽ là đủ để làm

if (stringVariable == null) { 
} 

khi làm việc với Strings nó có thể trả tiền để kiểm tra Apache Commons StringUtils.

Nó luôn luôn trả tiền để kiểm tra các thư viện commache commons vì chúng có rất nhiều tiện ích tối ưu (cho Strings, Collections, Dates và như vậy) mà có xu hướng tốt hơn so với những người viết tại nhà.

9

nếu stringvariable đã là rỗng, nó không tồn tại như một đối tượng String nữa, vì vậy nó thậm chí sẽ không có phương thức .equals! Vì vậy, trong trường hợp khi stringvariable không, những gì bạn đang thực sự làm là null.equals(null), tại thời điểm đó bạn sẽ nhận được NullPointerExceptionnull không có phương thức .equals().

+0

Giải thích tuyệt vời @ Jama22 –

+0

Trong khi nhận xét được phê duyệt, thực tế, giúp trả lời "tinh thần" của câu hỏi OP, (họ chỉ yêu cầu "bất kỳ suy nghĩ nào") Tôi tin câu trả lời này sẽ mở rộng thêm một chút về "lý do" để giúp người đọc trong tương lai. – Aterxerxes

1

Phương thức equals() không hoạt động với tham số null.

Phương thức cần có đối tượng hoặc chuỗi làm thông số.

public boolean equals(Object anObject) 

Vì null không phải là đối tượng. Is null an Object?.

Cũng tham khảo tài liệu java 7 cho biết rằng bằng sẽ cho kết quả nếu và chỉ khi đối tượng được truyền không phải là rỗng.

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals(java.lang.Object)