Hari ini saya akan menunjukkan kepada anda teknik mudah tentang cara untuk mengelakkan NullPointerException dalam aplikasi anda. Mereka mudah diikuti, tetapi meningkatkan kebolehpercayaan dan kualiti kod anda dengan ketara. Lebih-lebih lagi, dalam pengalaman saya, petua pertama akan memberi kesan ketara pada kualiti kod anda. Jika anda mengetahui sebarang helah pengaturcaraan Java yang lain, jangan ragu untuk berkongsinya dalam ulasan.
Gunakan
Terdapat banyak perpustakaan sumber terbuka yang menanggung beban ujian yang berat untuk Cuba untuk tidak kembali
Ini adalah satu lagi petua pengaturcaraan Java yang baik yang diterangkan Joshua Bloch dalam bukunya Java: Pengaturcaraan Berkesan. Apabila mengembalikan koleksi atau tatasusunan kosong, pastikan kaedah asas memanggil
Panggil kaedah equals() dan equalsIgnoreCase() pada literal rentetan yang diketahui dan bukannya objek yang tidak diketahui
Sentiasa panggil kaedahequals()
pada rentetan yang diketahui yang anda tahu bukan null
. Kaedahnya equals()
adalah simetri, iaitu, memanggil a.equals(b)
dan b.equals(a)
akan memberikan hasil yang sama (jika a
dan b
tidak null
), dan atas sebab ini ramai pengaturcara tidak memberi perhatian kepada objek yang dipanggil equals()
, y a
atau y b
. Salah satu kesan sampingan ini ialah NullPointerException jika kaedah 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 petua paling mudah untuk mengelakkan NullPointerException, tetapi ia sahaja membuat peningkatan yang besar kerana kaedah itu equals()
terdapat di mana-mana.
Pilih valueOf() berbanding toString() dalam kes di mana kedua-duanya menghasilkan hasil yang sama
Memandangkan memanggiltoString()
rujukan dengan nilai null
membuang NullPointerException, lebih baik menggunakan panggilan valueOf()
apabila kita boleh mendapatkan hasil yang sama, kerana memanggil valueOf()
daripada null
pulangan null
. Ini benar terutamanya untuk kelas pembalut 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 petua ini apabila anda tidak pasti sama ada objek boleh wujud null
atau tidak.
Gunakan null
kaedah dan perpustakaan selamat
Terdapat banyak perpustakaan sumber terbuka yang menanggung beban ujian yang berat untuk null
. Salah satu yang paling biasa adalah StringUtils
dari Apache Commons. Menggunakan kaedah seperti StringUtils.isBlank()
, isNumeric()
, isWhiteSpace()
dsb. anda tidak perlu risau tentang membuang 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));
Output: true true false false Namun, sebelum menggunakan, jangan lupa membaca dokumentasi null
kaedah dan kelas yang selamat. Ini adalah satu lagi helah Java terbaik yang membawa kepada peningkatan besar tanpa memerlukan banyak usaha.
Cuba untuk tidak kembali null
dari kaedah, lebih baik mengembalikan koleksi kosong
Ini adalah satu lagi petua pengaturcaraan Java yang baik yang diterangkan Joshua Bloch dalam bukunya Java: Pengaturcaraan Berkesan. Apabila mengembalikan koleksi atau tatasusunan kosong, pastikan kaedah asas memanggil size()
atau length()
tidak membuang NullPointerException. Kelas Collections
secara khusus mengisytiharkan pelaksanaan mudah bagi senarai kosong, set dan kamus: Collections.EMPTY_LIST
, Collections.EMPTY_SET
dan Collections.EMPTY_MAP
. Sebagai contoh:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Begitu juga, anda boleh menggunakannya Collections.EMPTY_SET
dan Collections.EMPTY_MAP
bukannya kembali null
.
Gunakan anotasi @NotNull dan @Nullable
Dalam huraian kaedah anda, anda boleh menentukannull
konvensyen keselamatan kaedah menggunakan anotasi @NotNull
dan @Nullable untuk menunjukkan sama ada kaedah boleh kembali null
atau tidak. Penyusun dan IDE moden boleh menggunakan anotasi ini untuk menganalisis kod anda dan memberi nasihat yang sesuai, contohnya, tentang kehilangan cek untuk null
, atau sebaliknya, tentang kemungkinan mengalih keluar semakan yang tidak perlu yang menyumbat kod. Anotasi sedemikian, sebagai contoh, disokong oleh IntelliJ IDE dan FindBugs, dan ia juga disertakan dalam JSR 305. Tetapi walaupun IDE anda tidak menyokong anotasi sedemikian, ia akan menjadi dokumentasi yang baik untuk diri mereka sendiri. Melihat @NotNull
dan @Nullable
akan lebih mudah bagi pengaturcara untuk memahami di mana untuk menambah cek null
dan di mana tidak. Ini, dengan cara ini, adalah amalan yang agak baru di kalangan pengaturcara Java, dan ia akan mengambil masa untuk merebak.
Elakkan autoboxing dan autounboxing yang tidak perlu dalam kod anda
Ini bukan sahaja membawa kepada penciptaan objek sementara yang tidak diperlukan, tetapi autoboxing juga boleh membuang NullPointerException jika kelas pembalut ialahnull
. Sebagai contoh, kod berikut akan membuang NullPointerException jika entri orang itu tidak mengandungi nombor telefon dan mengembalikan null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
Apabila menggunakan autoboxing atau autounboxing, bukan sahaja kesamaan, tetapi juga ketidaksamaan <
> >
boleh mengakibatkan NullPointerException.
Ikut konvensyen dan tentukan lalai yang munasabah.
Salah satu cara terbaik untuk mengelakkan NullPointerException dalam Java adalah dengan betul mengisytiharkan dan mengikuti konvensyen pengekodan. Kebanyakan NullPointerExceptions berlaku apabila anda cuba mencipta objek tanpa mempunyai semua data dan kebergantungan yang diperlukannya. Dengan menghalang penciptaan objek yang belum selesai dengan menolak permintaan sedemikian, anda akan menyelamatkan diri anda daripada sejumlah besar NullPointerExceptions pada masa hadapan. Begitu juga, jika anda membenarkan penciptaan objek, anda harus memilih nilai lalai yang munasabah. Sebagai contoh, objek kelasEmployee
tidak boleh dibuat tanpa nama dan id
, tetapi mungkin tidak mempunyai nombor telefon. Dalam kes ini, objek Employee
tanpa nombor boleh mengembalikan sifar sebaliknya null
. Walaupun tingkah laku objek sedemikian harus difikirkan terlebih dahulu - mungkin lebih mudah untuk diperiksa null
daripada menghubungi nombor yang tidak wujud. Dalam kes ini, mempunyai syarat tambahan mengenai medan yang mana null
dan yang mana bukan akan membantu membuat keputusan yang betul. Secara umum, pilihan antara ranap program dengan serta-merta atau memberikannya null
adalah keputusan reka bentuk yang penting, dan sebaik sahaja anda membuat pilihan, anda mesti mengikutinya secara konsisten.
Tetapkan sekatan pada peringkat DBMS
Apabila menggunakan pangkalan data untuk menyimpan objek program anda, seperti Pelanggan atau Pesanan, adalah bijak untuk menentukan "null
ness" objek anda pada peringkat DBMS, menggunakan sekatan jadual yang sesuai. Pangkalan data selalunya mengandungi maklumat daripada pelbagai sumber, dan memperkenalkan semakan untuk nilai yang hilang akan meningkatkan integriti data anda. Di samping itu, kehadiran semakan untuk null pada peringkat DBMS akan mengurangkannya dalam kod Java anda: dengan memuatkan data daripada pangkalan data ke objek Java, anda boleh memastikan kehadirannya dan mengeluarkan " " yang tidak perlu != null
daripada kod program.
Gunakan Corak Objek Null
MenciptaNull
objek khas ialah satu lagi cara untuk mengelakkan NullPointerExcpetion dalam Java. Mari kita anggap bahawa beberapa kaedah dalam aplikasi kita mengembalikan objek yang program itu kemudiannya berfungsi dengan memanggil kaedahnya. Sebagai contoh, kaedah Collection.iterator()
mengembalikan objek kelas Iterator
yang digunakan untuk lelaran melalui koleksi. Kemudian jika objek asal tidak mempunyai apa-apa iterator, null
sebaliknya anda boleh mengembalikan Null
objek khas yang mempunyai kaedah hasNext()
yang sentiasa mengembalikan false
. Itu sahaja, pembaca yang budiman, di sinilah saya mengakhiri petua saya untuk menghapuskan ralat NullPointerException program Java. Anda akan menghargai betapa bergunanya peraturan yang mudah dan tidak membebankan ini. Sebagai peringatan, jika anda ingin berkongsi sebarang helah NullPointerException lain dalam program Java, sila berbuat demikian dalam ulasan. Diterjemah khusus untuk pelajar JavaRush. Asal
GO TO FULL VERSION