Bugun 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.
Foydalanish
Ko'pgina ochiq kodli kutubxonalar mavjud bo'lib, ular uchun sinovning og'ir yukini o'z zimmasiga oladi Usuldan qaytmaslikka harakat qiling
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
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 a
va b
bo'lmasa ) va shuning uchun ko'pgina dasturchilar qaysi ob'ektlar y yoki y null
deb atalishiga e'tibor bermaydilar . Buning yon ta'siridan biri, agar usul chaqirilgan bo'lsa, NullPointerException hisoblanadi . equals()
a
b
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");
}
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 null
qo'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()
null
null
Integer
Float
Double
BigDecimal
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 StringUtils
Apache 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 Collections
bo'sh ro'yxatlar, to'plamlar va lug'atlarning qulay ilovalarini e'lon qiladi: Collections.EMPTY_LIST
, Collections.EMPTY_SET
va Collections.EMPTY_MAP
. Masalan:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Collections.EMPTY_SET
Xuddi shunday, siz uni Collections.EMPTY_MAP
qaytarish o'rniga foydalanishingiz mumkin null
.
@NotNull va @Nullable izohlaridan foydalaning
Usullaringiz tavsifida siznull
izohlar @NotNull
va @Nullable yordamida usul xavfsizligi qoidalarini belgilashingiz mumkin, bu usul qaytib kelishi null
yoki 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 null
yoki 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 @Nullable
tushunishi osonroq bo'ladi . null
Aytgancha, 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 mumkinnull
. 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'ektiniEmployee
va nomsiz yaratib bo'lmaydi id
, lekin telefon raqami bo'lmasligi mumkin. Bunday holda, Employee
raqamsiz ob'ektlar o'rniga nolni qaytarishi mumkin null
. Ob'ektning bunday xatti-harakatlarini oldindan o'ylab ko'rish kerak bo'lsa-da - null
mavjud bo'lmagan raqamga qo'ng'iroq qilishdan ko'ra tekshirish osonroq bo'lishi mumkin. Bunday holda, qaysi maydonlar mavjud null
va 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 null
muhim dizayn qaroridir va siz tanlaganingizdan so'ng, unga izchil rioya qilishingiz kerak.
DBMS darajasida cheklovlarni o'rnating
null
Mijozlar 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 != null
dastur kodidan olib tashlashingiz mumkin.
Null ob'ekt naqshidan foydalaning
MaxsusNull
-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 . Iterator
Agar asl ob'ektda iterator bo'lmasa, buning o'rniga har doim qaytaradigan usulga ega bo'lgan null
maxsus 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. AslNull
hasNext()
false
GO TO FULL VERSION