Hari ini saya akan menunjukkan teknik sederhana tentang cara menghindari NullPointerException di aplikasi Anda. Mereka mudah diikuti, namun secara signifikan meningkatkan keandalan dan kualitas kode Anda. Selain itu, menurut pengalaman saya, tip pertama akan berdampak nyata pada kualitas kode Anda. Jika Anda mengetahui trik pemrograman Java lainnya, silakan bagikan di komentar.
Gunakan
Ada banyak perpustakaan sumber terbuka yang menanggung beban berat dalam pengujian Usahakan untuk tidak kembali
Ini adalah tip pemrograman Java bagus lainnya yang dijelaskan Joshua Bloch dalam bukunya Java: Effective Programming. Saat mengembalikan koleksi atau array kosong, pastikan memanggil metode dasar seperti
Panggil metode sama dengan() dan sama denganIgnoreCase() pada literal string yang diketahui, bukan pada objek yang tidak diketahui
Selalu panggil metodeequals()
pada string yang dikenal, padahal Anda tahu itu bukan string yang dikenal null
. Metodenya equals()
simetris, yaitu memanggil a.equals(b)
dan b.equals(a)
akan memberikan hasil yang sama (jika a
dan b
tidak null
), dan karena itu banyak pemrogram yang tidak memperhatikan objek mana yang dipanggil equals()
, y a
atau y b
. Salah satu efek sampingnya adalah NullPointerException jika metode ini dipanggil null
.
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
Ini adalah tip paling sederhana untuk menghindari NullPointerException, tetapi ini saja sudah memberikan kemajuan besar karena metode ini equals()
dapat ditemukan di mana-mana.
Pilih valueOf() daripada toString() jika keduanya menghasilkan hasil yang sama
Karena pemanggilantoString()
referensi dengan nilai null
akan memunculkan NullPointerException, lebih baik menggunakan pemanggilan valueOf()
ketika kita bisa mendapatkan hasil yang sama, karena pemanggilan valueOf()
dari null
return null
. Hal ini terutama berlaku untuk kelas pembungkus seperti Integer
, Float
, Double
atau BigDecimal
.
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Gunakan tips ini ketika Anda tidak yakin apakah suatu benda bisa ada null
atau tidak.
Gunakan null
metode dan perpustakaan -safe
Ada banyak perpustakaan sumber terbuka yang menanggung beban berat dalam pengujian null
. Salah satu yang paling umum adalah StringUtils
dari Apache Commons. Menggunakan metode seperti StringUtils.isBlank()
, isNumeric()
, isWhiteSpace()
dll. Anda tidak perlu khawatir untuk melempar NullPointerException.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
Keluaran: benar benar salah salah Namun, sebelum menggunakan, jangan lupa membaca dokumentasi null
metode dan kelas yang aman. Ini adalah salah satu trik Java terbaik yang menghasilkan peningkatan besar tanpa memerlukan banyak usaha.
Usahakan untuk tidak kembali null
dari suatu metode, lebih baik mengembalikan koleksi yang kosong
Ini adalah tip pemrograman Java bagus lainnya yang dijelaskan Joshua Bloch dalam bukunya Java: Effective Programming. Saat mengembalikan koleksi atau array kosong, pastikan memanggil metode dasar seperti size()
atau length()
tidak menampilkan NullPointerException. Kelas Collections
secara khusus mendeklarasikan implementasi yang mudah dari daftar, kumpulan, dan kamus kosong: Collections.EMPTY_LIST
, Collections.EMPTY_SET
dan Collections.EMPTY_MAP
. Misalnya:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Demikian pula, Anda dapat menggunakannya Collections.EMPTY_SET
alih Collections.EMPTY_MAP
-alih mengembalikannya null
.
Gunakan anotasi @NotNull dan @Nullable
Dalam deskripsi metode Anda, Anda dapat menentukannull
konvensi keamanan metode menggunakan anotasi @NotNull
dan @Nullable untuk menunjukkan apakah suatu metode dapat kembali null
atau tidak. Kompiler dan IDE modern dapat menggunakan anotasi ini untuk menganalisis kode Anda dan memberikan saran yang sesuai, misalnya, tentang hilangnya tanda centang untuk null
, atau sebaliknya, tentang kemungkinan menghapus tanda centang yang tidak perlu yang menyumbat kode. Anotasi seperti itu, misalnya, didukung oleh IntelliJ IDE dan FindBugs, dan juga disertakan dalam JSR 305. Namun meskipun IDE Anda tidak mendukung anotasi tersebut, anotasi tersebut akan menjadi dokumentasi yang baik. Melihatnya @NotNull
dan @Nullable
akan lebih mudah bagi programmer untuk memahami di mana harus menambahkan tanda centang null
dan di mana tidak. Omong-omong, ini adalah praktik yang cukup baru di kalangan pemrogram Java, dan perlu waktu untuk menyebarkannya.
Hindari autoboxing dan autounboxing yang tidak perlu dalam kode Anda
Hal ini tidak hanya menyebabkan pembuatan objek sementara yang tidak perlu, tetapi autoboxing juga dapat memunculkan NullPointerException jika kelas pembungkusnya adalahnull
. Misalnya, kode berikut akan memunculkan NullPointerException jika entri orang tidak berisi nomor telepon dan mengembalikan null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
Saat menggunakan autoboxing atau autounboxing, tidak hanya persamaan, tetapi juga ketidaksetaraan <
> >
dapat menghasilkan NullPointerException.
Ikuti konvensi dan tentukan standar yang masuk akal.
Salah satu cara terbaik untuk menghindari NullPointerException di Java adalah dengan mendeklarasikan dan mengikuti konvensi pengkodean dengan benar. Kebanyakan NullPointerExceptions terjadi saat Anda mencoba membuat objek tanpa memiliki semua data dan dependensi yang diperlukan. Dengan mencegah pembuatan objek yang belum selesai dengan menolak permintaan tersebut dengan baik, Anda akan menyelamatkan diri Anda dari sejumlah besar NullPointerExceptions di masa mendatang. Demikian pula, jika Anda mengizinkan pembuatan objek, Anda harus memilih nilai default yang masuk akal. Misalnya, objek kelasEmployee
tidak dapat dibuat tanpa nama dan id
, namun mungkin tidak memiliki nomor telepon. Dalam hal ini, objek Employee
tanpa nomor mungkin akan menghasilkan nol null
. Meskipun perilaku objek seperti itu harus dipikirkan terlebih dahulu - mungkin lebih mudah untuk memeriksanya null
daripada menelepon nomor yang tidak ada. Dalam hal ini, memiliki ketentuan tambahan tentang bidang mana yang termasuk null
dan mana yang tidak akan membantu membuat keputusan yang tepat. Secara umum, pilihan antara segera menghentikan program atau menugaskannya null
merupakan keputusan desain yang penting, dan setelah Anda menentukan pilihan, Anda harus mengikutinya secara konsisten.
Tetapkan batasan pada tingkat DBMS
Saat menggunakan database untuk menyimpan objek program Anda, seperti Pelanggan atau Pesanan, sebaiknya tentukan "null
ness" objek Anda di tingkat DBMS, dengan menggunakan batasan tabel yang sesuai. Basis data sering kali berisi informasi dari berbagai sumber, dan melakukan pemeriksaan terhadap nilai yang hilang akan meningkatkan integritas data Anda. Selain itu, adanya pemeriksaan null di tingkat DBMS akan menguranginya dalam kode Java Anda: dengan memuat data dari database ke objek Java, Anda dapat memastikan keberadaannya dan menghapus " != null
" yang tidak perlu dari kode program.
Gunakan Pola Objek Null
MembuatNull
objek khusus adalah cara lain untuk menghindari NullPointerExcpetion di Java. Mari kita asumsikan bahwa beberapa metode dalam aplikasi kita mengembalikan objek yang kemudian digunakan oleh program dengan memanggil metodenya. Misalnya, metode Collection.iterator()
mengembalikan objek kelas Iterator
yang digunakan untuk melakukan iterasi melalui koleksi. Kemudian jika objek asli tidak memiliki iterator apa pun, null
Anda dapat mengembalikan Null
objek khusus yang memiliki metode hasNext()
yang selalu mengembalikan false
. Itu saja, pembaca yang budiman, di sinilah saya mengakhiri tip saya untuk menghilangkan kesalahan NullPointerException pada program Java. Anda akan menghargai betapa bermanfaatnya aturan-aturan sederhana dan tidak memberatkan ini. Sebagai pengingat, jika Anda ingin membagikan trik NullPointerException lainnya di program Java, silakan melakukannya di komentar. Diterjemahkan khusus untuk siswa JavaRush. Asli
GO TO FULL VERSION