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

时间:2010-01-09 10:47:10

标签: java android

我正在创建一个从网络上检索图像的应用程序。如果无法检索图像,则应使用另一个本地图像。

尝试执行以下行时:

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

如果drawable为null,则行if(drawable.equals(null))抛出异常。

有没有人知道如何检查drawable的值,以便在它为null并且检索本地图像时抛出异常(执行drawable = getRandomDrawable())?

9 个答案:

答案 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 {}解决方案……而您呢?