Stringga o'tirishdan oldin ob'ektni bo'sh ekanligini tekshirish

null pointer istisno atayotgan kod bYoki.

Mana mening kodim:

StringBuilder strName = new StringBuilder(100); 
strName.append(someClassObject.getFirstName().getContent().get(0));
strName.append(" ");
strName.append(someClassObject.getLastName().getContent().get(0));
name = strName.toString();

Name someClassObject.getLastName() ga ega bo'lmoqchi bo'lganingizda null pointer istisnosini tashlashdir. GetContent (). Get (0) .


Mening savolim - bo'sh ko'rsatkichni qo'lga olishda eng yaxshi amaliyotga qanday o'tish kerakligi.

Bunga o'xshash narsani o'ylayotgan narsa:

String lastName = (String) someClassObject.getLastName().getContent().get(0);
if(lastName == null) {
    lastName = "";
    LOGGER.warn("Last name is null");
}
strName.append(lastName);

So'zlar sonini String ga o'zgartirishi va null yoki yo'qligini tekshirish uchun mantiqiy tuzilishi kerak bo'lganidan beri ikkilanmayman.

Yoki

try { 
    strName.append(someClassObject.getLastName().getContent().get(0));
} catch(NullPointerException e) {
    LOGGER.warn("Last name of the conusmer is null");
}
1
qo'shib qo'ydi muallif xandermonkey, manba
qo'shib qo'ydi muallif xandermonkey, manba
Sizning ikkinchi yondashuvingiz bilan bog'liq eng katta muammo, siz nol bo'lgan narsalarni aytib bera olmaysiz. someClassObject getLastName() getContent() yoki haqiqiy mag'lubiyatning qaytish qiymati bo'lishi mumkin.
qo'shib qo'ydi muallif Jim Garrison, manba
Sizning ikkinchi yondashuvingiz bilan bog'liq eng katta muammo, siz nol bo'lgan narsalarni aytib bera olmaysiz. someClassObject getLastName() getContent() yoki haqiqiy mag'lubiyatning qaytish qiymati bo'lishi mumkin.
qo'shib qo'ydi muallif Jim Garrison, manba
qo'shib qo'ydi muallif zee, manba
qo'shib qo'ydi muallif zee, manba
Null yo'qligini tekshirish uchun uni mag'lubiyatga aylantirishga hojat yo'q
qo'shib qo'ydi muallif Alex R, manba
Sizning savolingizga javob bo'lmasa-da, buni albatta quyidagicha o'qiysiz: en.wikipedia.org/wiki/Law_of_Demeter (ayniqsa, "Ob'ektni boshqa usul bilan qaytarilgan a'zolarning usullarini chaqirishga yo'l qo'ymaslik kerak" deb e'tibor bering).
qo'shib qo'ydi muallif avysk, manba
Sizning savolingizga javob bo'lmasa-da, buni albatta quyidagicha o'qiysiz: en.wikipedia.org/wiki/Law_of_Demeter (ayniqsa, "Ob'ektni boshqa usul bilan qaytarilgan a'zolarning usullarini chaqirishga yo'l qo'ymaslik kerak" deb e'tibor bering).
qo'shib qo'ydi muallif avysk, manba
@JimGarrison Nolga qaytib keladigan odamga qarshilik qilmasam nima bo'ladi? Faqatgina shu ob'ekt butunlay yo'q. Buni aytmoqchiman, chunki someClassObject - teginishni istamagan juda eski kod.
qo'shib qo'ydi muallif robben, manba
@JimGarrison Nolga qaytib keladigan odamga qarshilik qilmasam nima bo'ladi? Faqatgina shu ob'ekt butunlay yo'q. Buni aytmoqchiman, chunki someClassObject - teginishni istamagan juda eski kod.
qo'shib qo'ydi muallif robben, manba
Bu ikki savol replikatsiya emas!
qo'shib qo'ydi muallif robben, manba
Bu ikki savol replikatsiya emas!
qo'shib qo'ydi muallif robben, manba

6 javoblar

Istisno faqat null ob'ekt bilan uslubni chaqirganda yuzaga keladi (siz qaysi ob'ektni root null ekanligini ko'rish uchun disk raskadroviz).

Sizning null someClassObject.getLastName() bo'lsa Java'dagi ushbu nashrni o'chirib qo'yishni tekshirishingiz mumkin:

String lastName = (someClassObject.getLastName() == null) ? "" : someClassObject.getLastName().getContent().get(0);
0
qo'shib qo'ydi

Istisno faqat null ob'ekt bilan uslubni chaqirganda yuzaga keladi (siz qaysi ob'ektni root null ekanligini ko'rish uchun disk raskadroviz).

Sizning null someClassObject.getLastName() bo'lsa Java'dagi ushbu nashrni o'chirib qo'yishni tekshirishingiz mumkin:

String lastName = (someClassObject.getLastName() == null) ? "" : someClassObject.getLastName().getContent().get(0);
0
qo'shib qo'ydi

StringBuilder.append() ning barcha ortiqcha yuklanishi bo'sh. Kirish null bo'lsa, ular null matnini qo'shadilar. Http:// someClassObject.getLastName (). GetContent (). Get (0) iboralaridagi usullarning har qandayidan NPE olishingiz kerak.

Agar ushbu usullar bo'sh bo'lmasa, NPEni qo'lga olishdan keyingi usulni chertishdan oldin nullani tekshirib ko'ring. Shunday qilib, siz ba'zi boilerplate kodini yozishingiz kerak bo'ladi, ammo bajarish vaqti arzon bo'ladi. Istisnolar qimmatga tushadi, hatto ular boshqarilsa ham.

Boshqa variant esa, iloji bo'lsa, getLastName() , getContent() va get() usullarini o'zgartiring, NPEni qo'yish o'rniga bo'sh qiymatni qaytarish. Bunday holda siz ushbu o'zgarishlarni amalga oshirsangiz, ushbu usullarning boshqa foydalanuvchilari qanday javob berishini o'ylab ko'rishingiz kerak.

0
qo'shib qo'ydi

StringBuilder.append() ning barcha ortiqcha yuklanishi bo'sh. Kirish null bo'lsa, ular null matnini qo'shadilar. Http:// someClassObject.getLastName (). GetContent (). Get (0) iboralaridagi usullarning har qandayidan NPE olishingiz kerak.

Agar ushbu usullar bo'sh bo'lmasa, NPEni qo'lga olishdan keyingi usulni chertishdan oldin nullani tekshirib ko'ring. Shunday qilib, siz ba'zi boilerplate kodini yozishingiz kerak bo'ladi, ammo bajarish vaqti arzon bo'ladi. Istisnolar qimmatga tushadi, hatto ular boshqarilsa ham.

Boshqa variant esa, iloji bo'lsa, getLastName() , getContent() va get() usullarini o'zgartiring, NPEni qo'yish o'rniga bo'sh qiymatni qaytarish. Bunday holda siz ushbu o'zgarishlarni amalga oshirsangiz, ushbu usullarning boshqa foydalanuvchilari qanday javob berishini o'ylab ko'rishingiz kerak.

0
qo'shib qo'ydi