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
如果yourObject
为null
。
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());