![Hiylələr və məsləhətlər. Java proqramlarında NullPointerException-dan necə qaçınmaq olar - 1]()
Bu 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.
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)
və
b.equals(a)
eyni nəticəni verəcəkdir (əgər
a
və
b
olmasa ) və bu səbəbdən bir çox proqramçılar hansı obyektlərin y və ya y
null
adlandırıldığına diqqət yetirmirlər . Bunun yan təsirlərindən biri metod çağırıldığı təqdirdə NullPointerExceptiondır .
equals()
a
b
null
Object unknownObject = null;
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is 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
null
zə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()
null
null
Integer
Float
Double
BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd));
System.out.println(bd.toString());
null
Bir obyektin mövcud olub-olmamasından əmin olmadığınız zaman bu məsləhətlərdən istifadə edin .
null
Tə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
StringUtils
Apache Commons-dandır. kimi üsullardan istifadə etməklə
StringUtils.isBlank()
,
isNumeric()
,
isWhiteSpace()
və s. NullPointerException atmaqdan narahat olmaq lazım deyil.
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
Collections
xüsusi olaraq boş siyahıların, dəstlərin və lüğətlərin rahat tətbiqlərini elan edir:
Collections.EMPTY_LIST
,
Collections.EMPTY_SET
və
Collections.EMPTY_MAP
. Misal üçün:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Eynilə, geri qaytarmaq əvəzinə
Collections.EMPTY_SET
istifadə edə bilərsiniz .
Collections.EMPTY_MAP
null
@NotNull və @Nullable annotasiyalarından istifadə edin
Metodlarınızın təsvirində
null
annotasiyalardan və @Nullable-dan istifadə edərək metodun təhlükəsizlik konvensiyalarını müəyyən edə bilərsiniz
@NotNull
ki, 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
null
və 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
@NotNull
və proqramçı üçün çeki hara əlavə edəcəyini və harada olmadığını
@Nullable
başa düşməsi daha asan olacaq .
null
Bu, 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
Employee
və adı olmadan yaradıla bilməz
id
, lakin telefon nömrəsi olmaya bilər. Bu halda,
Employee
nö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 -
null
mö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
null
onu 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
null
Müş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ə
!= null
proqram kodundan lazımsız " " silə bilərsiniz.
Null Obyekt Modelindən istifadə edin
Xüsusi
Null
obyektlə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
null
xü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. OrijinalNull
hasNext()
false
GO TO FULL VERSION