Saya membuat aplikasi yang mengambil gambar dari web. Jika gambar tidak dapat diambil gambar lokal lain harus digunakan.
Saat mencoba menjalankan baris berikut:
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
drawable = getRandomDrawable();
}
Garis if (drawable.equals (null)) memunculkan pengecualian jika drawable bernilai null.
Adakah yang tahu bagaimana seharusnya nilai drawable diperiksa agar tidak memunculkan pengecualian jika nilainya null dan mengambil gambar lokal (mengeksekusi drawable = getRandomDrawable ())?
Jawaban:
Solusi Java 8 yang Diedit:
final Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Anda dapat mendeklarasikan
drawable
final
dalam kasus ini.Seperti yang ditunjukkan Chasmo, Android tidak mendukung Java 8 saat ini. Jadi solusi ini hanya mungkin dalam konteks lain.
sumber
Common
kelas, dan mengizinkan Anda untuk memberikan URL cadangan, dan menjaga tanggung jawab bersama.Optional.of
mengandung arti, bahwa nilainya bukan null, sehinggaorElseGet
tidak perlu. Anda harus menggunakanOptional.ofNullable
dalam kasus ini.Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable == null) { drawable = getRandomDrawable(); }
The
equals()
Metode pemeriksaan untuk nilai kesetaraan, yang berarti bahwa itu membandingkan isi dari dua benda. Karenanull
bukan objek, ini macet saat mencoba membandingkan konten objek Anda dengan kontennull
.The
==
cek Operator untuk referensi kesetaraan, yang berarti bahwa itu terlihat apakah dua benda yang sebenarnya objek yang sama . Ini tidak membutuhkan objek untuk benar-benar ada; dua objek yang tidak ada (null
referensi) juga sama.sumber
Saya menggunakan pendekatan ini:
if (null == drawable) { //do stuff } else { //other things }
Dengan cara ini saya menemukan meningkatkan keterbacaan baris - ketika saya membaca dengan cepat melalui file sumber saya dapat melihat itu adalah pemeriksaan nol.
Berkenaan dengan mengapa Anda tidak dapat memanggil
.equals()
objek yang mungkinnull
; jika referensi obyek Anda memiliki (yaitu 'ditarik') adalah pada kenyataannyanull
, itu tidak menunjuk ke sebuah obyek di heap. Ini berarti tidak ada objek di heap tempat panggilan untukequals()
berhasil.Semoga berhasil!
sumber
DIY
private boolean isNull(Object obj) { return obj == null; }
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (isNull(drawable)) { drawable = getRandomDrawable(); }
sumber
drawable.equals(null)
Baris di atas memanggil metode "sama dengan (...)" pada objek drawable.
Jadi, jika drawable bukan null dan merupakan objek nyata, semua berjalan baik dengan memanggil metode "sama dengan (null)" akan mengembalikan "salah"
Namun jika "drawable" bernilai null, artinya memanggil metode "sama dengan (...)" pada objek null, artinya memanggil metode pada objek yang tidak ada sehingga memunculkan "NullPointerException"
Untuk memeriksa apakah sebuah objek ada dan bukan null, gunakan yang berikut ini
if(drawable == null) { ... ... }
Dalam kondisi di atas, kami memeriksa bahwa variabel referensi "drawable" adalah null atau berisi beberapa nilai (referensi ke objeknya) sehingga tidak akan memunculkan pengecualian jika drawable bernilai null karena memeriksa
null == null
adalah benar.
sumber
if (yourObject instanceof yourClassName)
akan mengevaluasifalse
jikayourObject
adanull
.sumber
Mungkin sedikit lebih efisien untuk menangkap NullPointerException. Metode di atas berarti bahwa runtime memeriksa pointer nol dua kali.
sumber
if x == null
solusi check-in ganda ?Gunakan google guava libs untuk menangani is-null-check (pembaruan deamon)
Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
sumber
Optional
hari ini.Hanya untuk memberikan beberapa ide kepada pengembang sumber oracle Java :-)
Solusinya sudah ada di .Net dan lebih mudah dibaca!
Dalam Visual Basic .Net
Drawable drawable = If(Common.getDrawableFromUrl(this, product.getMapPath()) ,getRandomDrawable() )
Dalam C #
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath() ?? getRandomDrawable();
Solusi ini sangat efektif sebagai solusi Java Opsional (string default hanya dievaluasi jika nilai asli adalah null) tanpa menggunakan ekspresi lambda, hanya dengan menambahkan operator baru.
Hanya untuk melihat dengan cepat perbedaan dengan solusi Java, saya telah menambahkan 2 solusi Java
Menggunakan Opsional di Java
Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Menggunakan {} di Java
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable != null) { drawable = getRandomDrawable(); }
Secara pribadi, saya suka VB.Net tetapi saya lebih suka
?? C#
atauif {}
solusi di Java ... dan Anda?sumber