Ich erstelle eine Anwendung, die Bilder aus dem Web abruft. Falls das Bild nicht abgerufen werden kann, sollte ein anderes lokales Bild verwendet werden.
Beim Versuch, die folgenden Zeilen auszuführen:
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
drawable = getRandomDrawable();
}
Die Zeile if (drawable.equals (null)) löst eine Ausnahme aus, wenn drawable null ist.
Weiß jemand, wie der Wert von drawable überprüft werden sollte, um keine Exception auszulösen, falls er null ist und das lokale Image abrufen (drawable = getRandomDrawable () ausführen)?
Editierte Java 8-Lösung:
final Drawable drawable =
Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
.orElseGet(() -> getRandomDrawable());
Sie können in diesem Fall drawable
final
angeben.
Wie Chasmo darauf hinweist, unterstützt Android derzeit Java 8 nicht. Diese Lösung ist also nur in anderen Zusammenhängen möglich.
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
drawable = getRandomDrawable();
}
Die equals()
-Methode prüft auf Wert Gleichheit, dh sie vergleicht den Inhalt von zwei Objekten. Da null
kein Objekt ist, stürzt dies ab, wenn Sie versuchen, den Inhalt Ihres Objekts mit dem Inhalt von null
zu vergleichen.
Der ==
-Operator prüft aufreferenzGleichheit, was bedeutet, dass es sich bei den beiden Objekten tatsächlich um das sehr gleiche Objekt handelt. Dies erfordert nicht, dass die Objekte tatsächlich existieren. Zwei nicht vorhandene Objekte (null
-Referenzen) sind ebenfalls gleich.
Ich verwende diesen Ansatz:
if (null == drawable) {
//do stuff
} else {
//other things
}
Auf diese Weise verbessert sich die Lesbarkeit der Zeile. Wenn ich schnell eine Quelldatei durchliesse, kann ich feststellen, dass es sich um eine Nullprüfung handelt.
Im Hinblick darauf, warum Sie .equals()
nicht für ein Objekt aufrufen können, das null
sein kann; Wenn die Objektreferenz (dh 'drawable') ist tatsächlich null
, zeigt sie nicht auf ein Objekt auf dem Heap. Dies bedeutet, dass sich kein Objekt auf dem Heap befindet, für das der Aufruf von equals()
erfolgreich ist.
Viel Glück!
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)
wird zu false
ausgewertet, wenn yourObject
null
ist.
drawable.equals(null)
In der obigen Zeile wird die Methode "equals (...)" für das Zeichenobjekt aufgerufen.
Wenn also drawable nicht null ist und es sich um ein reales Objekt handelt, funktioniert alles gut, wenn die Methode "equals (null)" aufgerufen wird, die den Wert "false" zurückgibt.
Wenn "drawable" jedoch null ist, bedeutet dies, dass die Methode "equals (...)" für ein Nullobjekt aufgerufen wird. Das bedeutet, dass eine Methode für ein Objekt aufgerufen wird, das nicht existiert.
Um zu prüfen, ob ein Objekt existiert und nicht null ist, verwenden Sie Folgendes
if(drawable == null) {
...
...
}
In der obigen Bedingung überprüfen wir, ob die Referenzvariable "drawable" null ist oder einen Wert enthält (Referenz zu ihrem Objekt), sodass keine Ausnahme ausgelöst wird, wenn drawable als Überprüfung null ist
null == null
ist gültig.
Es ist wahrscheinlich etwas effizienter, eine NullPointerException abzufangen. Die obigen Methoden bedeuten, dass die Laufzeit zweimal auf Nullzeiger überprüft.
Verwenden Sie google guava libs , um die is-null-check (deamons Update) zu behandeln
Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
Nur um Oracle Java Source Developer einige Ideen zu geben :-)
Die Lösung existiert bereits in .Net und ist sehr lesbarer!
In Visual Basic .Net
Drawable drawable
= If(Common.getDrawableFromUrl(this, product.getMapPath())
,getRandomDrawable()
)
In c #
Drawable drawable
= Common.getDrawableFromUrl(this, product.getMapPath()
?? getRandomDrawable();
Diese Lösungen sind als optionale Java-Lösung (die Standardzeichenfolge wird nur ausgewertet, wenn der ursprüngliche Wert null ist) ohne Verwendung eines Lambda-Ausdrucks leistungsfähig.
Um schnell den Unterschied zur Java-Lösung zu erkennen, habe ich die 2 Java-Lösungen hinzugefügt
Optional in Java verwenden
Drawable drawable =
Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
.orElseGet(() -> getRandomDrawable());
Verwenden von {} in Java
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable != null)
{
drawable = getRandomDrawable();
}
Ich persönlich mag VB.Net, aber ich bevorzuge die ?? C#
- oder if {}
-Lösung in Java ... und Sie?