簡體   English   中英

Java:如何檢查對象是否為空?

[英]Java: How to check if object is null?

我正在創建一個從Web檢索圖像的應用程序。 如果無法檢索圖像,則應使用另一個本地圖像。

在嘗試執行以下行時:

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

如果drawable為null,則行if(drawable.equals(null))拋出異常。

有沒有人知道如何檢查drawable的值,以便在它為null並且檢索本地圖像時拋出異常(執行drawable = getRandomDrawable())?

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

equals()方法檢查相等性,這意味着它比較兩個對象的內容 由於null不是對象,因此在嘗試將對象的內容與null的內容進行比較時會崩潰。

==運算符檢查引用相等性,這意味着它查看這兩個對象實際上是否是同一個對象 這不要求對象實際存在; 兩個不存在的對象( null引用)也是相等的。

編輯Java 8解決方案:

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

在這種情況下,您可以聲明drawable final

正如Chasmo指出的那樣,Android目前不支持Java 8。 所以這個解決方案只能在其他環境中使用。

我用這種方法:

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

這樣我發現提高了行的可讀性 - 當我通過源文件快速讀取時,我可以看到它是一個空檢查。

關於為什么你不能在一個可能為null的對象上調用.equals() ; 如果對象引用您有(也就是“繪制”)實際上 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) yourObjectnull if (yourObject instanceof yourClassName)將評估為false

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

已驗證。

使用google guava libs來處理is-null-check(deamon的更新)

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

捕獲NullPointerException可能稍微有點效率。 上述方法意味着運行時檢查兩次空指針。

只是給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中使用Optional

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,但我更喜歡?? C# ?? C#或者Java中的if {}解決方案...而你呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM