Tworzę aplikację, która pobiera obrazy z sieci. W przypadku, gdy nie można pobrać obrazu, należy użyć innego obrazu lokalnego.
Podczas próby wykonania następujących linii:
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
drawable = getRandomDrawable();
}
Linia if (drawable.equals (null)) zgłasza wyjątek, jeśli drawable ma wartość null.
Czy ktoś wie, jak należy sprawdzić wartość drawable, aby nie zgłaszać wyjątku w przypadku, gdy jest null i pobrać lokalny obraz (wykonaj drawable = getRandomDrawable ())?
Odpowiedzi:
Edytowane rozwiązanie Java 8:
final Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Możesz zadeklarować
drawable
final
w tym przypadku.Jak zauważył Chasmo, Android nie obsługuje obecnie Java 8. Więc to rozwiązanie jest możliwe tylko w innych kontekstach.
źródło
Common
klasy i pozwoliłbym ci podać zastępczy adres URL i zachować razem obowiązki.Optional.of
oznacza, że wartość nie jest zerowa, a zatemorElseGet
jest niepotrzebna. Powinieneś użyćOptional.ofNullable
w tym przypadku.Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable == null) { drawable = getRandomDrawable(); }
Te
equals()
kontrole metoda dla wartości równości, co oznacza, że Porównuje zawartość dwóch obiektów. Ponieważnull
nie jest obiektem, powoduje to awarię podczas próby porównania zawartości obiektu z zawartościąnull
.Te
==
kontrole operatorskie dla odniesienia równości, co oznacza, że to wygląda, czy dwa obiekty są rzeczywiście bardzo sam obiekt . Nie wymaga to rzeczywistego istnienia obiektów; dwa nieistniejące obiekty (null
odniesienia) są również równe.źródło
Używam tego podejścia:
if (null == drawable) { //do stuff } else { //other things }
W ten sposób uważam, że poprawia czytelność wiersza - kiedy szybko czytam plik źródłowy, widzę, że jest to sprawdzenie zerowe.
W odniesieniu do tego, dlaczego nie możesz wywołać
.equals()
obiektu, który może byćnull
; jeśli odniesienie do obiektu, które posiadasz (a mianowicie „do rysowania”) jest w rzeczywistościnull
, nie wskazuje na obiekt na stercie. Oznacza to, że na stercie nie ma obiektu, na którym wywołanieequals()
może się powieść.Powodzenia!
źródło
majsterkowanie
private boolean isNull(Object obj) { return obj == null; }
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (isNull(drawable)) { drawable = getRandomDrawable(); }
źródło
drawable.equals(null)
Powyższy wiersz wywołuje metodę „equals (...)” na obiekcie rysowalnym.
Tak więc, gdy drawable nie ma wartości null i jest rzeczywistym obiektem, wszystko idzie dobrze, ponieważ wywołanie metody „equals (null)” zwróci wartość „false”
Ale kiedy „drawable” jest null, oznacza to wywołanie metody „equals (...)” na obiekcie zerowym, czyli wywołanie metody na obiekcie, który nie istnieje, więc rzuca „NullPointerException”
Aby sprawdzić, czy obiekt istnieje i czy nie jest pusty, użyj następujących poleceń
if(drawable == null) { ... ... }
W powyższym warunku sprawdzamy, czy zmienna referencyjna "drawable" jest pusta lub zawiera jakąś wartość (odniesienie do jej obiektu), więc nie zgłosi wyjątku w przypadku, gdy drawable jest null jako sprawdzanie
null == null
jest ważna.
źródło
if (yourObject instanceof yourClassName)
oceni,false
czyyourObject
jestnull
.źródło
Prawdopodobnie nieco bardziej wydajne jest wychwycenie wyjątku NullPointerException. Powyższe metody oznaczają, że środowisko wykonawcze dwukrotnie sprawdza wskaźniki o wartości null.
źródło
if x == null
?Użyj google guava libs do obsługi sprawdzania is-null-check (aktualizacja demona)
Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
źródło
Optional
już dziś korzystaj z Javy 8 .Tylko po to, by przekazać kilka pomysłów programistom Oracle Source Java :-)
Rozwiązanie już istnieje w .Net i jest bardziej czytelne!
W Visual Basic .Net
Drawable drawable = If(Common.getDrawableFromUrl(this, product.getMapPath()) ,getRandomDrawable() )
W języku C #
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath() ?? getRandomDrawable();
Te rozwiązania są potężne jako opcjonalne rozwiązanie Java (domyślny ciąg jest oceniany tylko wtedy, gdy oryginalna wartość ma wartość null) bez użycia wyrażenia lambda, tylko po dodaniu nowego operatora.
Aby szybko zobaczyć różnicę w porównaniu z rozwiązaniem Java, dodałem 2 rozwiązania Java
Używanie opcjonalnego w Javie
Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Używanie {} w Javie
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable != null) { drawable = getRandomDrawable(); }
Osobiście lubię VB.Net, ale wolę
?? C#
lubif {}
rozwiązanie w Javie ... a ty?źródło