JavaRush /Java Blogu /Random-AZ /Hiylələr və məsləhətlər. Java proqramlarında NullPointerE...
DarthVictor
Səviyyə

Hiylələr və məsləhətlər. Java proqramlarında NullPointerException-dan necə qaçmaq olar

Qrupda dərc edilmişdir
Hiylələr və məsləhətlər.  Java proqramlarında NullPointerException-dan necə qaçınmaq olar - 1Bu gün sizə tətbiqlərinizdə NullPointerException-dan necə qaçmaq üçün sadə üsulları göstərəcəyəm. Onları izləmək asandır, lakin kodunuzun etibarlılığını və keyfiyyətini əhəmiyyətli dərəcədə yaxşılaşdırır. Üstəlik, mənim təcrübəmə görə, ilk məsləhət kodunuzun keyfiyyətinə nəzərəçarpacaq dərəcədə təsir edəcək. Əgər başqa Java proqramlaşdırma fəndlərini bilirsinizsə, onları şərhlərdə bölüşməkdən çekinmeyin. Hiylələr və məsləhətlər.  Java proqramlarında NullPointerException-dan necə qaçmaq olar - 2

Naməlum obyekt deyil, məlum sətir literalında equals() və equalsIgnoreCase() metodlarına zəng edin

equals()Həmişə məlum sətirdə olmadığını bildiyiniz metodu çağırın null. Metod equals()simmetrikdir, yəni çağırır a.equals(b)b.equals(a)eyni nəticəni verəcəkdir (əgər abolmasa ) və bu səbəbdən bir çox proqramçılar hansı obyektlərin y və ya y nulladlandırıldığına diqqət yetirmirlər . Bunun yan təsirlərindən biri metod çağırıldığı təqdirdə NullPointerExceptiondır . 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 qaçmaq üçün ən sadə məsləhət idi, lakin bu, tək başına böyük təkmilləşdirməyə səbəb olur, çünki metod equals()hər yerdə tapılır.

Hər ikisinin eyni nəticə verdiyi hallarda toString() əvəzinə valueOf() seçin

toString()Dəyəri olan bir arayış çağırmaq NullPointerException yaratdığından, eyni nəticəni əldə edə bildiyimiz zaman nullzəngdən istifadə etmək daha yaxşıdır , çünki geri qaytarılır . Bu, xüsusilə , və ya kimi sarğı sinifləri üçün doğrudur . 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"
nullBir obyektin mövcud olub-olmamasından əmin olmadığınız zaman bu məsləhətlərdən istifadə edin .

nullTəhlükəsiz metodlardan və kitabxanalardan istifadə edin

üçün sınaq yükünü öz üzərinə götürən bir çox açıq mənbəli kitabxanalar var null. Ən çox yayılmışlardan biri StringUtilsApache Commons-dandır. kimi üsullardan istifadə etməklə StringUtils.isBlank(), isNumeric(), isWhiteSpace()və s. NullPointerException atmaqdan narahat olmaq lazım deyil.
//Методы 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));
Nəticə: true true false falsenull Və yenə də istifadə etməzdən əvvəl təhlükəsiz metodların və siniflərin sənədlərini oxumağı unutmayın . Bu, çox səy tələb etmədən böyük təkmilləşdirmələrə səbəb olan ən yaxşı Java hiylələrindən biridir.

Bir üsuldan qayıtmamağa çalışın null, boş kolleksiyanı qaytarmaq daha yaxşıdır

Bu, Joshua Bloch-un Java: Effektiv Proqramlaşdırma kitabında təsvir etdiyi başqa bir yaxşı Java proqramlaşdırma məsləhətidir. Boş kolleksiyaları və ya massivləri qaytararkən, əsas metodların çağırılmasının NullPointerException kimi size()və ya length()atmadığından əmin olun. Sinif Collectionsxüsusi olaraq boş siyahıların, dəstlərin və lüğətlərin rahat tətbiqlərini elan edir: Collections.EMPTY_LIST, Collections.EMPTY_SETCollections.EMPTY_MAP. Misal üçün:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
Eynilə, geri qaytarmaq əvəzinə Collections.EMPTY_SETistifadə edə bilərsiniz . Collections.EMPTY_MAPnull

@NotNull və @Nullable annotasiyalarından istifadə edin

Metodlarınızın təsvirində nullannotasiyalardan və @Nullable-dan istifadə edərək metodun təhlükəsizlik konvensiyalarını müəyyən edə bilərsiniz @NotNullki, bu metodun geri qayıdıb null-qayıtmayacağını göstərir. Müasir kompilyatorlar və IDE-lər kodunuzu təhlil etmək və müvafiq məsləhətlər vermək üçün bu annotasiyalardan istifadə edə bilər, məsələn, üçün çeki qaçırmaq nullvə ya əksinə, kodu bağlayan lazımsız çekin silinməsi ehtimalı haqqında. Belə annotasiyalar, məsələn, IntelliJ IDE və FindBugs tərəfindən dəstəklənir və onlar JSR 305-ə də daxildir. Lakin IDE-niz belə annotasiyaları dəstəkləməsə belə, onlar özlüyündə yaxşı sənədləşdirmə olacaqlar. Baxdıqda @NotNullvə proqramçı üçün çeki hara əlavə edəcəyini və harada olmadığını @Nullablebaşa düşməsi daha asan olacaq . nullBu, yeri gəlmişkən, Java proqramçıları arasında kifayət qədər yeni təcrübədir və onun yayılması üçün vaxt lazımdır.

Kodunuzda lazımsız autoboxing və autounboxingdən çəkinin

Bu, nəinki lazımsız müvəqqəti obyektlərin yaradılmasına gətirib çıxarır, həm də sarğı sinfi null. Məsələn, şəxsin girişində telefon nömrəsi yoxdursa və qaytarırsa, aşağıdakı kod NullPointerException atacaq null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Autoboxing və ya autounboxing istifadə edərkən, yalnız bərabərliklər deyil, həm də bərabərsizliklər <> >NullPointerException ilə nəticələnə bilər.

Konvensiyalara əməl edin və ağlabatan defoltları təyin edin.

Java-da NullPointerException-dan qaçmağın ən yaxşı yollarından biri kodlaşdırma konvensiyalarını düzgün elan etmək və onlara əməl etməkdir. Əksər NullPointerExceptions, tələb olunan bütün məlumatlara və asılılıqlara malik olmadan bir obyekt yaratmağa çalışdığınız zaman baş verir. Bu cür sorğuları zərif şəkildə rədd etməklə, yarımçıq obyektlərin yaradılmasının qarşısını almaqla, gələcəkdə özünüzü çoxlu sayda NullPointerExceptions-dan xilas edəcəksiniz. Eyni şəkildə, obyektin yaradılmasına icazə versəniz, ağlabatan standart dəyər seçməlisiniz. Məsələn, sinif obyekti Employeevə adı olmadan yaradıla bilməz id, lakin telefon nömrəsi olmaya bilər. Bu halda, Employeenömrəsi olmayan obyektlər əvəzinə sıfırı qaytara bilər null. Obyektin bu cür davranışını əvvəlcədən düşünmək lazım olsa da - nullmövcud olmayan nömrəyə zəng etməkdənsə, onu yoxlamaq daha asan ola bilər. Bu halda hansı sahələrin olub null-olmadığı barədə əlavə şərtlərin olması düzgün qərar verməyə kömək edəcək. Ümumiyyətlə, proqramı dərhal qəzaya uğratmaq və ya nullonu təyin etmək arasında seçim mühüm dizayn qərarıdır və seçim etdikdən sonra ardıcıl olaraq ona əməl etməlisiniz.

DBMS səviyyəsində məhdudiyyətlər təyin edin

nullMüştərilər və ya Sifarişlər kimi proqram obyektlərinizi saxlamaq üçün verilənlər bazasından istifadə edərkən, müvafiq cədvəl məhdudiyyətlərindən istifadə edərək, DBMS səviyyəsində obyektlərinizin "nəsliyyətini" müəyyən etmək məqsədəuyğundur . Verilənlər bazaları çox vaxt bir neçə mənbədən məlumat ehtiva edir və çatışmayan dəyərlər üçün yoxlamaların tətbiqi məlumatlarınızın bütövlüyünü yaxşılaşdıracaq. Bundan əlavə, DBMS səviyyəsində null üçün yoxlamaların olması onları Java kodunuzda azaldacaq: verilənlər bazasından məlumatları Java obyektlərinə yükləməklə onların mövcudluğuna əmin ola və != nullproqram kodundan lazımsız " " silə bilərsiniz.

Null Obyekt Modelindən istifadə edin

Xüsusi Nullobyektlərin yaradılması Java-da NullPointerExcpetion-dan qaçmağın başqa bir yoludur. Fərz edək ki, tətbiqimizdəki bəzi metodlar öz metodlarını çağıraraq proqramın sonradan işlədiyi obyekti qaytarır. Məsələn, metod kolleksiyanı təkrarlamaq üçün istifadə olunan Collection.iterator()sinif obyektini qaytarır . IteratorƏgər orijinal obyektin iteratoru yoxdursa, bunun əvəzinə həmişə qaytaran metodu olan nullxüsusi obyekti qaytara bilərsiniz . Hamısı budur, əziz oxucu, Java proqramlarını NullPointerException səhvlərindən təmizləmək üçün məsləhətlərimi burada bitirirəm. Bu sadə və ağır olmayan qaydaların nə qədər faydalı ola biləcəyini qiymətləndirəcəksiniz. Xatırladaq ki, Java proqramlarında hər hansı digər NullPointerException hiylələrini bölüşmək istəyirsinizsə, şərhlərdə bunu etməkdən çekinmeyin. Xüsusi olaraq JavaRush tələbələri üçün tərcümə edilmişdir. OrijinalNullhasNext()false
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION