2010-01-29 29 views
10

Đôi khi, tôi thấy điều này:Kiểm tra nếu hai đối tượng đều bình đẳng ngay cả khi họ có thể được null

if (a.equals(b)) do(something); 

Tuy nhiên, nếu a là null, một NullPointerException được ném. Giả sử khi a==nullb==null hoặc nếu chỉ a==b mà tôi muốn do(something). Cách đơn giản nhất để thực hiện việc kiểm tra này mà không bị ngoại lệ là gì?

+0

Xử lý null là trường hợp đặc biệt? Nó có vẻ như một giải pháp tầm thường mà tôi cho rằng có một lý do bạn không thể làm điều đó? Xin hãy giải thích. –

+0

Điều này có vẻ rất tầm thường phải không? Dường như đã có hai người khác. Điều này sẽ tạo ra một câu hỏi phỏng vấn thú vị. Nó không phải là khó, nhưng đó là khó khăn để làm một cách đơn giản. – User1

+0

Đôi khi những thứ trông đơn giản không phải lúc nào cũng dễ thực hiện nhất. Đây là bài học đầu tiên tôi học được trong giải tích, và tìm kiếm câu trả lời trong bất cứ thứ gì đã cứu tôi khỏi ALOT sai lầm – Jason

Trả lời

22
if(a==b || (a!=null && a.equals(b))) 

(Các a==b xử lý các trường hợp khi cả hai đều là null.)


Cũng lưu ý của Java 7 trở lên Object.equals phương pháp:

if(java.util.Object.equals(a, b)) 
+4

+1, đây là khá nhiều những gì khác nhau .equals() phương pháp tiện ích làm, quá. Ví dụ: http://commons.apache.org/lang/api/org/apache/commons/lang/ObjectUtils.html#equals%28java.lang.Object,%20java.lang.Object%29 – PSpeed

+1

Vì không phải tất cả bằng() phương pháp chứa "if (o == this) trả về true" tối ưu hóa, tôi nghĩ rằng công thức này là người chiến thắng rõ ràng, và là những gì tôi được sử dụng trong phương pháp Objects.equal() của ổi. –

+0

Câu trả lời rất hay. Chỉ cần một lưu ý: trong câu trả lời của bạn, ** Object ** nên ** Objects ** –

24

Một cách khác để viết nó .

if (a == null ? b == null : a.equals(b)) 
+1

Đọc khá tốt! – fastcodejava

+3

Dễ đọc hơn câu trả lời được chấp nhận –

+0

@Steve - đó là vấn đề về ý kiến. –

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