我正在创建一个从网络上检索图像的应用程序。如果无法检索图像,则应使用另一个本地图像。
尝试执行以下行时:
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
drawable = getRandomDrawable();
}
如果drawable为null,则行if(drawable.equals(null))抛出异常。
有没有人知道如何检查drawable的值,以便在它为null并且检索本地图像时抛出异常(执行drawable = getRandomDrawable())?
答案 0 :(得分:153)
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
drawable = getRandomDrawable();
}
equals()
方法检查 value 是否相等,这意味着它会比较两个对象的内容。由于null
不是对象,因此在尝试将对象的内容与null
的内容进行比较时会崩溃。
==
运算符检查引用是否相等,这意味着它会查看这两个对象是否实际上是非常相同的对象。这不要求对象实际存在;两个不存在的对象(null
引用)也是相等的。
答案 1 :(得分:32)
已编辑的Java 8解决方案:
final Drawable drawable =
Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
.orElseGet(() -> getRandomDrawable());
在这种情况下,您可以声明drawable
final
。
正如Chasmo指出的那样,Android目前不支持Java 8。所以这个解决方案只能在其他情况下使用。
答案 2 :(得分:15)
我使用这种方法:
if (null == drawable) {
//do stuff
} else {
//other things
}
这种方式我发现提高了行的可读性 - 当我通过源文件快速阅读时,我可以看到它是一个空检查。
关于为什么你不能在一个可能是.equals()
的对象上调用null
的原因;如果你拥有的对象引用(即'drawable')实际上是null
,它就不会指向堆上的对象。这意味着堆上没有对象equals()
的调用可以成功。
祝你好运!
答案 3 :(得分:7)
DIY
private boolean isNull(Object obj) {
return obj == null;
}
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
drawable = getRandomDrawable();
}
答案 4 :(得分:5)
if (yourObject instanceof yourClassName)
为false
, yourObject
将评估为null
。
答案 5 :(得分:4)
drawable.equals(null)
上面的行在drawable对象上调用“equals(...)”方法。
因此,当drawable不为null并且它是一个真实对象时,一切顺利,因为调用“equals(null)”方法将返回“false”
但是当“drawable”为null时,则表示在null对象上调用“equals(...)”方法,意味着在不存在的对象上调用方法,因此抛出“NullPointerException”
要检查对象是否存在且不为null,请使用以下
if(drawable == null) {
...
...
}
在上面的条件中,我们检查引用变量“drawable”是否为null或包含一些值(对其对象的引用),因此如果drawable为null,则不会抛出异常
null == null
有效。
答案 6 :(得分:0)
捕获NullPointerException可能稍微有点效率。上述方法意味着运行时检查两次空指针。
答案 7 :(得分:0)
使用google guava libs处理is-null-check(deamon的更新)
Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
答案 8 :(得分:0)
只是向oracle Java源开发人员提供一些想法:-)
该解决方案已经存在于.Net中,并且更具可读性!
在Visual Basic .Net中
Drawable drawable
= If(Common.getDrawableFromUrl(this, product.getMapPath())
,getRandomDrawable()
)
在C#中
Drawable drawable
= Common.getDrawableFromUrl(this, product.getMapPath()
?? getRandomDrawable();
这些解决方案功能强大,可作为可选Java解决方案(仅当原始值为null时才评估默认字符串),而无需使用lambda表达式,而只是添加一个新的运算符。
为了快速了解与Java解决方案的区别,我添加了2种Java解决方案
在Java中使用可选
Drawable drawable =
Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
.orElseGet(() -> getRandomDrawable());
在Java中使用{}
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable != null)
{
drawable = getRandomDrawable();
}
我个人喜欢VB.Net,但是我更喜欢Java中的?? C#
或if {}
解决方案……而您呢?