Java:如何检查对象是否为空?

我正在创build一个从网上检索图像的应用程序。 如果图像不能被检索,则应使用另一个本地图像。

尝试执行以下几行时:

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

if(drawable.equals(null))如果drawable为null,则会引发exception。

有没有人知道应该如何检查绘制的值,以避免抛出一个exception,如果它为空,并检索本地图像(执行drawable = getRandomDrawable())?

编辑的Java 8解决scheme:

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

在这种情况下,你可以声明drawable final

Chasmo指出,Android目前不支持Java 8。 所以这个解决scheme只能在其他情况下使用。

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

equals()方法检查值是否相等,这意味着它比较两个对象的内容 。 由于null不是一个对象,因此在尝试比较对象的内容和null的内容时会崩溃。

==运算符检查引用是否相等,这意味着它看起来两个对象是否实际上是相同的对象 。 这不需要实际存在的对象; 两个不存在的对象( null引用)也是相等的。

我使用这种方法:

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

这样我发现提高了行的可读性 – 当我通过源文件快速读取时,我可以看到它是一个空检查。

至于你为什么不能在一个可能为null的对象上调用.equals() 如果你有的对象引用(即'drawable')实际上是null ,它不会指向堆上的一个对象。 这意味着在对equals()的调用可以成功的堆上没有任何对象。

祝你好运!

DIY

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

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

if (yourObject instanceof yourClassName)将计算为false如果yourObjectnull

 drawable.equals(null) 

上面的行在drawable对象上调用“equals(…)”方法。

所以,当drawable不是null,它是一个真实的对象时,调用“equals(null)”方法将返回“false”

但是当“drawable”为null时,则意味着在空对象上调用“equals(…)”方法,意味着在不存在的对象上调用一个方法,因此抛出“NullPointerException”

要检查对象是否存在并且不为空,请使用以下内容

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

在上面的条件中,我们检查引用variables“drawable”是否为null或包含某个值(引用它的对象),所以在drawable为null的情况下它不会引发exception

 null == null 

已validation。

捕获NullPointerException可能稍微有效一些。 上述方法意味着运行时正在检查空指针两次。

使用谷歌guava库处理is-null-check(deamon的更新)

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