it-swarm.com.de

Java: Wie kann ich überprüfen, ob das Objekt null ist?

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)?

60
Niko Gamulin

Editierte Java 8-Lösung:

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

Sie können in diesem Fall drawablefinal angeben.

Wie Chasmo darauf hinweist, unterstützt Android derzeit Java 8 nicht. Diese Lösung ist also nur in anderen Zusammenhängen möglich.

30
deamon
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.

149
Thomas

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!

15
outofcoffee

DIY

private boolean isNull(Object obj) {
    return obj == null;
}

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
    drawable = getRandomDrawable();
}
7
Eddie B

if (yourObject instanceof yourClassName) wird zu false ausgewertet, wenn yourObjectnull ist.

5
heapuser
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.

4
Yatendra Goel

Es ist wahrscheinlich etwas effizienter, eine NullPointerException abzufangen. Die obigen Methoden bedeuten, dass die Laufzeit zweimal auf Nullzeiger überprüft. 

0
Tom R

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());
0
Bala

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?

0
schlebe