2010-01-09 71 views
49

Tôi đang tạo một ứng dụng truy xuất hình ảnh từ web. Trong trường hợp không thể truy xuất hình ảnh, một hình ảnh cục bộ khác sẽ được sử dụng.Java: Cách kiểm tra xem đối tượng có rỗng không?

Trong khi cố gắng để thực hiện những dòng sau:

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); 
if (drawable.equals(null)) { 
    drawable = getRandomDrawable(); 
} 

Dòng if (drawable.equals (null)) ném một ngoại lệ nếu drawable là null.

Có ai biết giá trị của drawable được kiểm tra để không ném một ngoại lệ trong trường hợp nó là null và truy xuất hình ảnh cục bộ (execute drawable = getRandomDrawable())?

+18

Sử dụng * if (drawable == null) * Gọi bất kỳ phương pháp trên một đối tượng NULL là một NullPointerException. – diciu

+3

Tại sao bạn không viết câu trả lời thông thường thay vì nhận xét, diciu? – deamon

+0

@JaredBurrows Không chỉnh sửa mã trong câu hỏi theo cách đánh bại mục đích của câu hỏi! – Gilles

Trả lời

22

Edited Java 8 Giải pháp:

final Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) 
     .orElseGet(() -> getRandomDrawable()); 

Bạn có thể tuyên bố drawablefinal trong trường hợp này.

Như Chasmo đã chỉ ra, Android không hỗ trợ Java 8 vào lúc này. Vì vậy, giải pháp này chỉ có thể có trong các ngữ cảnh khác.

+6

Có lẽ không phải là một ý tưởng tốt - bạn sẽ quay trở lại Fortran 60, nơi cả hai mặt của điều kiện được đánh giá, sau đó chỉ có một được sử dụng. Điều này là xấu nếu chi nhánh không sử dụng có bất kỳ tính toán, đó là đúng nhất thời gian, vì vậy nó không phải là một phương pháp hữu ích nói chung. Tôi muốn chuyển điều kiện sang lớp 'Common', và cho phép bạn cung cấp một URL dự phòng và giữ các trách nhiệm với nhau. –

+1

Ví dụ này được viết lại hoàn toàn trong Java 8, vì vậy giải pháp của tôi không còn bị đánh giá vô ích nữa (như @PeteKirkham đã chỉ ra trong giải pháp ban đầu của tôi). – deamon

+1

Android không hỗ trợ Java 8. Nó chỉ hỗ trợ lên đến Java 7 (nếu bạn có kitkat) và vẫn không có động cơ gọi, chỉ có đường cú pháp mới. Bên cạnh đó, 'Optional.of' ngụ ý, rằng giá trị không phải là null, và do đó' orElseGet' là không cần thiết. Bạn nên sử dụng 'Optional.ofNullable' trong trường hợp này. –

130
if (drawable == null) { 
    ... 
} 

Các equals() phương pháp kiểm tra cho giá trị bình đẳng, có nghĩa là nó sẽ so sánh nội dung của hai đối tượng. Kể từ null không phải là một đối tượng, điều này treo khi cố gắng so sánh nội dung của đối tượng của bạn với nội dung của null.

Các == kiểm tra nhà điều hành cho tham khảo bình đẳng, có nghĩa là nó trông cho dù hai đối tượng thực sự là rất giống đối tượng. Điều này không yêu cầu các đối tượng thực sự tồn tại; hai đối tượng không tồn tại (null tham chiếu) cũng bằng nhau.

+45

Tôi muốn thêm một mẹo rất có giá trị: Nếu bạn có chuỗi hoặc hằng số để so sánh, * luôn luôn * đặt chúng đầu tiên trong mệnh đề equals. (if ("sói" Equals (myDogString))) là tốt hơn nhiều so với (if (myDogString.equals ("sói"))) vì trong trường hợp myDogString thứ hai có thể được null và ném một NPE trong khi trong trường hợp đầu tiên nó không quan trọng nếu myDogString là null. –

+16

Được biết đến như một điều kiện Yoda: "nếu một coyote, con chó là ..." – Thomas

+1

Tôi cũng muốn thêm, rằng vì Java 7 có một phương thức Objects.equals(), cho phép bạn không quan tâm đến cú pháp Yoda – maryokhin

3
drawable.equals(null) 

Dòng trên gọi phương thức "bằng (...)" trên đối tượng có thể kéo.

Vì vậy, khi drawable không phải là null và nó là một đối tượng thực tế, sau đó mọi việc suôn sẻ như cách gọi "equals (null)" phương pháp sẽ trở lại "false"

Nhưng khi "drawable" là null, sau đó nó có nghĩa là gọi phương thức "equals (...)" trên đối tượng null, có nghĩa là gọi phương thức trên đối tượng không tồn tại để nó ném "NullPointerException"

Để kiểm tra xem đối tượng có tồn tại hay không , sử dụng sau đây

if(drawable == null) { 
    ... 
    ... 
} 

Trong điều kiện trên, chúng tôi đang che cking rằng biến tài liệu tham khảo "drawable" là null hoặc chứa một số giá trị (tham chiếu đến đối tượng của nó) nên nó sẽ không ném ngoại lệ trong trường hợp drawable là null như kiểm tra

null == null 

là hợp lệ.

13

tôi sử dụng phương pháp này:

if (null == drawable) { 
    //do stuff 
} else { 
    //other things 
} 

Bằng cách này tôi thấy cải thiện khả năng đọc của dòng - như tôi đã đọc một cách nhanh chóng thông qua một tập tin nguồn tôi có thể thấy đó là một kiểm tra null.

Liên quan đến lý do bạn không thể gọi .equals() trên một đối tượng có thể là null; nếu tham chiếu đối tượng bạn có (cụ thể là 'drawable') trên thực tế null, nó không trỏ đến một đối tượng trên heap. Điều này có nghĩa là không có đối tượng trên heap mà trên đó cuộc gọi đến equals() có thể thành công.

Chúc bạn may mắn!

+2

Tôi cũng thích nếu ( == ) xây dựng như một cách để bảo vệ bản thân khỏi bị gán ngẫu nhiên. – Scott

0

Có thể hiệu quả hơn một chút để bắt NullPointerException. Các phương thức trên có nghĩa là thời gian chạy đang kiểm tra các con trỏ null hai lần.

+0

Kiểm tra đôi trong giải pháp 'if x == null' ở đâu? – deamon

+0

Sau câu lệnh if, thời gian chạy sẽ kiểm tra lại một con trỏ null khi đối tượng được sử dụng. Tôi không biết liệu điều này có được tối ưu hóa bởi trình biên dịch hay không. –

+4

Điều này đi ngược lại sự khôn ngoan thông thường, sử dụng các ngoại lệ như luồng điều khiển. – James

5

if (yourObject instanceof yourClassName) sẽ đánh giá là false nếu yourObjectnull.

0

Sử dụng google guava libs để xử lý là null-séc (cập nhật deamon của)

Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable()); 
+0

Sử dụng tốt hơn Java 8 'Tùy chọn' ngay hôm nay. – deamon

7

DIY

private boolean isNull(Object obj) { 
    return obj == null; 
} 

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); 
if (isNull(drawable)) { 
    drawable = getRandomDrawable(); 
} 
Các vấn đề liên quan