[英]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)
yourObject
為null
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.