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

Nik*_*lin 74 java android

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

在尝试执行以下行时:

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
  drawable = getRandomDrawable();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*mas 162

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
    drawable = getRandomDrawable();
}
Run Code Online (Sandbox Code Playgroud)

equals()方法检查相等性,这意味着它比较两个对象的内容.由于null不是对象,因此在尝试将对象的内容与内容进行比较时会崩溃null.

==运营商检查参考平等,这意味着它看起来两个对象是否实际上是相同的对象.这不要求对象实际存在; 两个不存在的对象(null引用)也是相等的.

  • 我想添加一个非常有价值的提示:如果要比较字符串或常量,*总是*将它们放在equals子句中.(if("coyote".equals(myDogString)))比(if(myDogString.equals("coyote"))要好得多,因为在第二种情况下,myDogString可能为null并抛出NPE而在第一种情况下它不会如果myDogString为null则无关紧要. (55认同)
  • 被称为Yoda条件:"如果是土狼,狗是......" (19认同)
  • 我还想补充一点,因为 Java 7 有一个 Objects.equals() 方法,让你不用关心 Yoda 语法 (2认同)

dea*_*mon 34

编辑Java 8解决方案:

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

你可以drawable final在这种情况下申报.

正如Chasmo指出的那样,Android目前不支持Java 8.所以这个解决方案只能在其他环境中使用.

  • 可能不是一个好主意 - 你将回到Fortran 60,其中条件的两边都被评估,然后只有一个被使用.如果未使用的分支有任何计算,这是很糟糕的,这在大多数时候都是正确的,因此它不是一种通常有用的方法.我将条件移到`Common`类,并允许您提供后备URL,并将责任保持在一起. (7认同)

out*_*fee 19

我用这种方法:

if (null == drawable) {
  //do stuff
} else {
  //other things
}
Run Code Online (Sandbox Code Playgroud)

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

关于为什么你不能打电话给.equals()可能的对象null; 如果您拥有的对象引用(即'drawable')实际上null它,则它不指向堆上的对象.这意味着堆上没有对象equals()可以成功调用.

祝你好运!

  • 我也更喜欢使用if(<constant> == <variable>)构造来保护自己免受意外分配. (4认同)

Edd*_*e B 8

DIY

private boolean isNull(Object obj) {
    return obj == null;
}
Run Code Online (Sandbox Code Playgroud)
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
    drawable = getRandomDrawable();
}
Run Code Online (Sandbox Code Playgroud)


Yat*_*oel 5

drawable.equals(null)
Run Code Online (Sandbox Code Playgroud)

上一行在可绘制对象上调用“ equals(...)”方法。

因此,当drawable不为null且它是一个真实对象时,一切顺利,因为调用“ equals(null)”方法将返回“ false”

但是,当“ drawable”为null时,则意味着在空对象上调用“ equals(...)”方法,这意味着在不存在的对象上调用方法,从而抛出“ NullPointerException”

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

if(drawable == null) {
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

在上述条件下,我们正在检查引用变量“ drawable”是否为null或包含某个值(对其对象的引用),以便在drawable为null的情况下不会引发异常。

null == null
Run Code Online (Sandbox Code Playgroud)

已验证。


hea*_*ser 5

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