JavaRush /Java blogi /Random-UZ /Fokuslar va maslahatlar. Java ilovalarida NullPointerExce...
DarthVictor
Daraja

Fokuslar va maslahatlar. Java ilovalarida NullPointerExceptiondan qanday qochish kerak

Guruhda nashr etilgan
Fokuslar va maslahatlar.  Java ilovalarida NullPointerException dan qanday qochish kerak - 1Bugun men sizga ilovalaringizda NullPointerExceptiondan qanday qochish haqida oddiy usullarni ko'rsataman. Ularga amal qilish oson, lekin kodingiz ishonchliligi va sifatini sezilarli darajada yaxshilaydi. Bundan tashqari, mening tajribamga ko'ra, birinchi maslahat sizning kodingiz sifatiga sezilarli ta'sir qiladi. Agar siz Java dasturlashning boshqa fokuslarini bilsangiz, ularni sharhlarda baham ko'ring. Fokuslar va maslahatlar.  Java ilovalarida NullPointerException dan qanday qochish kerak - 2

Noma'lum ob'ekt o'rniga ma'lum bo'lgan satr literalida equals() va equalsIgnoreCase() usullarini chaqiring

equals()Siz bilmaydigan ma'lum qatordagi usulni har doim chaqiring null. Usul equals()simmetrik, ya'ni chaqiruvchi a.equals(b)va b.equals(a)bir xil natija beradi (agar ava bbo'lmasa ) va shuning uchun ko'pgina dasturchilar qaysi ob'ektlar y yoki y nulldeb atalishiga e'tibor bermaydilar . Buning yon ta'siridan biri, agar usul chaqirilgan bo'lsa, NullPointerException hisoblanadi . equals()abnull
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");
}
Bu NullPointerException dan qochishning eng oddiy maslahati edi, biroq uning o'zi katta yaxshilanishga olib keladi, chunki usul equals()hamma joyda mavjud.

Ikkalasi bir xil natija bergan hollarda toString() o'rniga valueOf() ni tanlang

toString()Qiymatli ma'lumotnomaga qo'ng'iroq qilish NullPointerExceptionni keltirib chiqarganligi sababli , biz bir xil natijani olishimiz mumkin bo'lganda nullqo'ng'iroq qilishdan foydalanish yaxshidir , chunki returns dan qo'ng'iroq qilish . Bu, ayniqsa , , yoki kabi o'rash sinflari uchun to'g'ri keladi . valueOf()valueOf()nullnullIntegerFloatDoubleBigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Ob'ekt mavjud yoki yo'qligiga ishonchingiz komil bo'lmaganda ushbu maslahatlardan foydalaning null.

Foydalanish null- xavfsiz usullar va kutubxonalar

Ko'pgina ochiq kodli kutubxonalar mavjud bo'lib, ular uchun sinovning og'ir yukini o'z zimmasiga oladi null. Eng keng tarqalganlaridan biri StringUtilsApache Commons-dan. StringUtils.isBlank(), va hokazo kabi usullardan foydalanish isNumeric(). isWhiteSpace()NullPointerExceptionni tashlash haqida tashvishlanishingiz shart emas.
//Методы 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));
Natija: true true false falsenull Va shunga qaramay, ishlatishdan oldin xavfsiz usullar va sinflar hujjatlarini o'qishni unutmang . Bu ko'p kuch talab qilmasdan katta yaxshilanishlarga olib keladigan yana bir eng yaxshi Java hiylalaridan biridir.

Usuldan qaytmaslikka harakat qiling null, bo'sh to'plamni qaytarish yaxshiroqdir

Bu Joshua Bloch o'zining Java: Samarali dasturlash kitobida tasvirlab bergan yana bir yaxshi Java dasturlash maslahatidir. Bo'sh to'plamlar yoki massivlarni qaytarishda, asosiy usullarni chaqirish NullPointerExceptionni yoqtirishi size()yoki length()chiqarmasligiga ishonch hosil qiling. Sinf Collectionsbo'sh ro'yxatlar, to'plamlar va lug'atlarning qulay ilovalarini e'lon qiladi: Collections.EMPTY_LIST, Collections.EMPTY_SETva Collections.EMPTY_MAP. Masalan:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
Collections.EMPTY_SETXuddi shunday, siz uni Collections.EMPTY_MAPqaytarish o'rniga foydalanishingiz mumkin null.

@NotNull va @Nullable izohlaridan foydalaning

Usullaringiz tavsifida siz nullizohlar @NotNullva @Nullable yordamida usul xavfsizligi qoidalarini belgilashingiz mumkin, bu usul qaytib kelishi nullyoki kelmasligini ko'rsatadi. Zamonaviy kompilyatorlar va IDElar ushbu izohlardan kodingizni tahlil qilish va tegishli maslahatlar berish uchun foydalanishi mumkin, masalan, uchun chekni o'tkazib yuborish nullyoki aksincha, kodni tiqilib qoladigan keraksiz chekni olib tashlash imkoniyati haqida. Bunday izohlar, masalan, IntelliJ IDE va ​​FindBugs tomonidan qo'llab-quvvatlanadi va ular JSR 305 ga ham kiritilgan. Lekin sizning IDE bunday izohlarni qo'llab-quvvatlamasa ham, ular o'z-o'zidan yaxshi hujjat bo'ladi. Qarab @NotNull, dasturchi qaerga chek qo'shishni va qayerga qo'shmaslikni @Nullabletushunishi osonroq bo'ladi . nullAytgancha, bu Java dasturchilari orasida juda yangi amaliyot bo'lib, uning tarqalishi uchun vaqt kerak bo'ladi.

Kodingizda keraksiz autoboxing va autounboxingdan saqlaning

Bu nafaqat keraksiz vaqtinchalik ob'ektlarni yaratishga olib keladi, balki o'rash sinfi bo'lsa, autoboxing NullPointerExceptionni ham tashlashi mumkin null. Misol uchun, agar shaxs yozuvida telefon raqami bo'lmasa va qaytarsa, quyidagi kod NullPointerException ni chiqaradi null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Autoboxing yoki autounboxingdan foydalanilganda, nafaqat tengliklar, balki tengsizliklar ham <> >NullPointerExceptionga olib kelishi mumkin.

Konventsiyalarga rioya qiling va oqilona defoltlarni belgilang.

Java'da NullPointerException dan qochishning eng yaxshi usullaridan biri kodlash qoidalarini to'g'ri e'lon qilish va ularga rioya qilishdir. Ko'pgina NullPointerExceptions ob'ektni barcha ma'lumotlarga va unga bog'liqliklarga ega bo'lmasdan yaratishga harakat qilganingizda paydo bo'ladi. Bunday so'rovlarni xushmuomalalik bilan rad etish orqali tugallanmagan ob'ektlarning yaratilishiga yo'l qo'ymaslik orqali siz kelajakda o'zingizni ko'p sonli NullPointerExceptionsdan qutqarasiz. Xuddi shunday, agar siz ob'ekt yaratishga ruxsat bersangiz, o'rtacha standart qiymatni tanlashingiz kerak. Masalan, sinf ob'ektini Employeeva nomsiz yaratib bo'lmaydi id, lekin telefon raqami bo'lmasligi mumkin. Bunday holda, Employeeraqamsiz ob'ektlar o'rniga nolni qaytarishi mumkin null. Ob'ektning bunday xatti-harakatlarini oldindan o'ylab ko'rish kerak bo'lsa-da - nullmavjud bo'lmagan raqamga qo'ng'iroq qilishdan ko'ra tekshirish osonroq bo'lishi mumkin. Bunday holda, qaysi maydonlar mavjud nullva qaysi biri yo'q bo'lgan qo'shimcha shartlarga ega bo'lish to'g'ri qaror qabul qilishga yordam beradi. Umuman olganda, dasturni zudlik bilan buzish yoki uni tayinlash o'rtasidagi tanlov nullmuhim dizayn qaroridir va siz tanlaganingizdan so'ng, unga izchil rioya qilishingiz kerak.

DBMS darajasida cheklovlarni o'rnating

nullMijozlar yoki Buyurtmalar kabi dastur ob'ektlarini saqlash uchun ma'lumotlar bazasidan foydalanganda, tegishli jadval cheklovlaridan foydalangan holda, ma'lumotlar bazasi tizimi darajasida ob'ektlaringizning "bo'lishi" ni belgilash oqilona . Ma'lumotlar bazalarida ko'pincha bir nechta manbalardan olingan ma'lumotlar mavjud va etishmayotgan qiymatlarni tekshirish ma'lumotlaringizning yaxlitligini yaxshilaydi. Bundan tashqari, DBMS darajasida null uchun tekshiruvlarning mavjudligi ularni Java kodingizda kamaytiradi: ma'lumotlar bazasidan ma'lumotlarni Java ob'ektlariga yuklash orqali siz ularning mavjudligiga ishonch hosil qilishingiz va keraksiz " "ni != nulldastur kodidan olib tashlashingiz mumkin.

Null ob'ekt naqshidan foydalaning

Maxsus Null-objects yaratish Java-da NullPointerExcpetion dan qochishning yana bir usuli hisoblanadi. Faraz qilaylik, bizning ilovamizdagi ba'zi bir usul o'z usullarini chaqirish orqali dastur keyinchalik ishlaydigan ob'ektni qaytaradi. Misol uchun, usul to'plam orqali takrorlash uchun ishlatiladigan Collection.iterator()sinf ob'ektini qaytaradi . IteratorAgar asl ob'ektda iterator bo'lmasa, buning o'rniga har doim qaytaradigan usulga ega bo'lgan nullmaxsus ob'ektni qaytarishingiz mumkin . Hammasi shu, aziz o'quvchi, men Java dasturlarini NullPointerException xatolaridan tozalash bo'yicha maslahatlarimni shu bilan yakunlayman. Ushbu oddiy va og'ir bo'lmagan qoidalar qanchalik foydali ekanligini tushunasiz. Eslatib oʻtamiz, agar siz Java dasturlarida boshqa NullPointerException nayranglarini baham koʻrmoqchi boʻlsangiz, buni izohlarda bemalol qiling. JavaRush talabalari uchun maxsus tarjima qilingan. AslNullhasNext()false
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION