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 soll, um keine Ausnahme auszulösen, falls er null ist, und um das lokale Image abzurufen (execute drawable = getRandomDrawable ())?
Antworten:
Bearbeitete Java 8-Lösung:
Sie können
drawable
final
in diesem Fall deklarieren .Wie Chasmo betonte, unterstützt Android Java 8 derzeit nicht. Diese Lösung ist also nur in anderen Kontexten möglich.
quelle
Common
Klasse verschieben und Ihnen erlauben, eine Fallback-URL anzugeben und die Verantwortlichkeiten zusammenzuhalten.Optional.of
bedeutet dies, dass der Wert nicht null ist und daher nicht erforderlichorElseGet
ist. Sie solltenOptional.ofNullable
in diesem Fall verwenden.Die
equals()
Methode überprüft Wert Gleichheit, was bedeutet , dass sie die vergleicht Inhalt von zwei Objekten. Danull
es sich nicht um ein Objekt handelt, stürzt dies ab, wenn Sie versuchen, den Inhalt Ihres Objekts mit dem Inhalt von zu vergleichennull
.Der
==
Operator prüft auf Referenzgleichheit , dh es wird geprüft , ob die beiden Objekte tatsächlich dasselbe Objekt sind . Dies erfordert nicht, dass die Objekte tatsächlich existieren. Zwei nicht vorhandene Objekte (null
Referenzen) sind ebenfalls gleich.quelle
Ich benutze diesen Ansatz:
Auf diese Weise verbessert sich die Lesbarkeit der Zeile. Wenn ich eine Quelldatei schnell durchlese, sehe ich, dass es sich um eine Nullprüfung handelt.
In Bezug darauf, warum Sie
.equals()
ein Objekt nicht aufrufen können, das sein kannnull
; wenn die Objektreferenz Sie (nämlich ‚ziehbar‘) haben ist in der Tatnull
, es nicht auf dem Heap auf ein Objekt zeigen. Dies bedeutet, dass sich auf dem Heap kein Objekt befindet, auf dem der Aufruf erfolgreich seinequals()
kann.Viel Glück!
quelle
DIY
quelle
Die obige Zeile ruft die Methode "equals (...)" für das zeichnbare Objekt auf.
Wenn also drawable nicht null ist und es sich um ein reales Objekt handelt, ist alles in Ordnung. Wenn Sie die Methode "equals (null)" aufrufen, wird "false" zurückgegeben.
Wenn "drawable" jedoch null ist, bedeutet dies, dass die Methode "equals (...)" für ein Nullobjekt aufgerufen wird und eine Methode für ein nicht vorhandenes Objekt aufgerufen wird, sodass "NullPointerException" ausgelöst wird.
Verwenden Sie Folgendes, um zu überprüfen, ob ein Objekt vorhanden und nicht null ist
In der obigen Bedingung prüfen wir, ob die Referenzvariable "drawable" null ist oder einen Wert enthält (Verweis auf ihr Objekt), sodass keine Ausnahme ausgelöst wird, falls drawable als Prüfung null ist
ist gültig.
quelle
if (yourObject instanceof yourClassName)
wird bewerten,false
obyourObject
istnull
.quelle
Es ist wahrscheinlich etwas effizienter, eine NullPointerException abzufangen. Die obigen Methoden bedeuten, dass die Laufzeit zweimal nach Nullzeigern sucht.
quelle
if x == null
Lösung?Verwenden Sie Google Guava Libs , um die is-null-Prüfung durchzuführen (Deamons Update).
quelle
Optional
heute besser .Nur um Oracle Java Source Developer einige Ideen zu geben :-)
Die Lösung existiert bereits in .Net und ist besser lesbar!
In Visual Basic .Net
In C #
Diese Lösungen sind leistungsstark als optionale Java-Lösung (Standardzeichenfolge wird nur ausgewertet, wenn der ursprüngliche Wert null ist) ohne Verwendung des Lambda-Ausdrucks, nur durch Hinzufügen eines neuen Operators.
Um den Unterschied zur Java-Lösung schnell zu erkennen, habe ich die beiden Java-Lösungen hinzugefügt
Verwenden von Optional in Java
Verwenden von {} in Java
Persönlich mag ich VB.Net, aber ich bevorzuge
?? C#
oderif {}
Lösung in Java ... und Sie?quelle