JavaRush /Blog Java /Random-MS /Trik dan petua. Bagaimana untuk mengelakkan NullPointerEx...

Trik dan petua. Bagaimana untuk mengelakkan NullPointerException dalam aplikasi Java

Diterbitkan dalam kumpulan
Trik dan petua.  Bagaimana untuk mengelakkan NullPointerException dalam aplikasi Java - 1Hari 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. Trik dan petua.  Bagaimana untuk mengelakkan NullPointerException dalam aplikasi Java - 2

Panggil kaedah equals() dan equalsIgnoreCase() pada literal rentetan yang diketahui dan bukannya objek yang tidak diketahui

Sentiasa panggil kaedah equals()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 adan btidak null), dan atas sebab ini ramai pengaturcara tidak memberi perhatian kepada objek yang dipanggil equals(), y aatau 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 memanggil toString()rujukan dengan nilai nullmembuang NullPointerException, lebih baik menggunakan panggilan valueOf()apabila kita boleh mendapatkan hasil yang sama, kerana memanggil valueOf()daripada nullpulangan null. Ini benar terutamanya untuk kelas pembalut seperti Integer, Float, Doubleatau 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 nullatau tidak.

Gunakan nullkaedah dan perpustakaan selamat

Terdapat banyak perpustakaan sumber terbuka yang menanggung beban ujian yang berat untuk null. Salah satu yang paling biasa adalah StringUtilsdari 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 nullkaedah dan kelas yang selamat. Ini adalah satu lagi helah Java terbaik yang membawa kepada peningkatan besar tanpa memerlukan banyak usaha.

Cuba untuk tidak kembali nulldari 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 Collectionssecara khusus mengisytiharkan pelaksanaan mudah bagi senarai kosong, set dan kamus: Collections.EMPTY_LIST, Collections.EMPTY_SETdan Collections.EMPTY_MAP. Sebagai contoh:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
Begitu juga, anda boleh menggunakannya Collections.EMPTY_SETdan Collections.EMPTY_MAPbukannya kembali null.

Gunakan anotasi @NotNull dan @Nullable

Dalam huraian kaedah anda, anda boleh menentukan nullkonvensyen keselamatan kaedah menggunakan anotasi @NotNulldan @Nullable untuk menunjukkan sama ada kaedah boleh kembali nullatau 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 @NotNulldan @Nullableakan lebih mudah bagi pengaturcara untuk memahami di mana untuk menambah cek nulldan 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 ialah null. 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 kelas Employeetidak boleh dibuat tanpa nama dan id, tetapi mungkin tidak mempunyai nombor telefon. Dalam kes ini, objek Employeetanpa nombor boleh mengembalikan sifar sebaliknya null. Walaupun tingkah laku objek sedemikian harus difikirkan terlebih dahulu - mungkin lebih mudah untuk diperiksa nulldaripada menghubungi nombor yang tidak wujud. Dalam kes ini, mempunyai syarat tambahan mengenai medan yang mana nulldan yang mana bukan akan membantu membuat keputusan yang betul. Secara umum, pilihan antara ranap program dengan serta-merta atau memberikannya nulladalah 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 " nullness" 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 != nulldaripada kod program.

Gunakan Corak Objek Null

Mencipta Nullobjek 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 Iteratoryang digunakan untuk lelaran melalui koleksi. Kemudian jika objek asal tidak mempunyai apa-apa iterator, nullsebaliknya anda boleh mengembalikan Nullobjek 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
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION