Бүгін мен сізге қолданбаларыңызда NullPointerException қалай болдырмауға болатыны туралы қарапайым әдістерді көрсетемін. Оларды орындау оңай, бірақ codeыңыздың сенімділігі мен сапасын айтарлықтай жақсартады. Сонымен қатар, менің тәжірибемде бірінші кеңес сіздің codeыңыздың сапасына айтарлықтай әсер етеді. Егер сіз Java бағдарламалаудың басқа амалдарын білсеңіз, оларды түсініктемелерде бөлісіңіз.
Тестілеудің ауыр жүгін көтеретін көптеген ашық бастапқы кітапханалар бар Әдістен оралмауға тырысыңыз
Бұл Джошуа Блок өзінің Java: Тиімді бағдарламалау кітабында сипаттайтын тағы бір жақсы Java бағдарламалау кеңесі.
Белгісіз нысанның орнына белгілі жол литералында equals() және equalsIgnoreCase() әдістерін шақырыңыз
equals()
Әрқашан сіз білетін белгілі жолдағы әдісті шақырыңыз null
. Әдіс equals()
симметриялы, яғни шақырады a.equals(b)
және b.equals(a)
бірдей нәтиже береді (егер a
және b
жоқ болса ), және осы себепті көптеген бағдарламашылар қандай an objectілердің y немесе y null
деп аталатынына назар аудармайды . Мұның жанама әсерлерінің бірі, егер әдіс шақырылса, NullPointerException болып табылады . 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");
}
Бұл NullPointerException болдырмаудың ең қарапайым кеңесі болды, бірақ оның өзі үлкен жақсартуға әкеледі, себебі әдіс equals()
барлық жерде кездеседі.
Екеуі де бірдей нәтиже беретін жағдайларда toString() орнына valueOf() мәнін таңдаңыз
toString()
Мәні бар сілтемеге қоңырау шалу NullPointerException жіберетіндіктен, біз бірдей нәтижеге қол жеткізген кезде null
қоңырау шалуды пайдаланған дұрыс , өйткені қайтару арқылы қоңырау шалу . Бұл әсіресе , , немесе сияқты орауыш сыныптарына қатысты . 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"
Нысанның бар-жоқтығына сенімді болмасаңыз, осы кеңестерді пайдаланыңыз null
.
null
Қауіпсіз әдістер мен кітапханаларды пайдаланыңыз
Тестілеудің ауыр жүгін көтеретін көптеген ашық бастапқы кітапханалар бар null
. Ең көп таралғандардың бірі - StringUtils
Apache Commons. StringUtils.isBlank()
, т.б. сияқты әдістерді қолдану isNumeric()
. isWhiteSpace()
NullPointerException лақтыру туралы алаңдамаудың қажеті жоқ.
//Методы 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));
Нәтижесі: true true false falsenull
Дегенмен, қолданар алдында қауіпсіз әдістер мен сыныптардың құжаттамасын оқып шығуды ұмытпаңыз . Бұл көп күш жұмсамай-ақ үлкен жақсартуларға әкелетін ең жақсы Java амалдарының бірі.
Әдістен оралмауға тырысыңыз null
, бос коллекцияны қайтарған дұрыс
Бұл Джошуа Блок өзінің Java: Тиімді бағдарламалау кітабында сипаттайтын тағы бір жақсы Java бағдарламалау кеңесі. size()
Бос жинақтарды немесе массивтерді қайтарған кезде, негізгі әдістерді шақыру NullPointerException сияқты немесе length()
шығармайтынын тексеріңіз . Класс Collections
бос тізімдердің, жиынтықтардың және сөздіктердің ыңғайлы іске асырылуын арнайы жариялайды: Collections.EMPTY_LIST
, Collections.EMPTY_SET
және Collections.EMPTY_MAP
. Мысалы:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Collections.EMPTY_SET
Сол сияқты, сіз оны Collections.EMPTY_MAP
қайтарудың орнына пайдалана аласыз null
.
@NotNull және @Nullable annotationларын пайдаланыңыз
Әдістеріңіздің сипаттамасында әдістің қайтара алатынын немесе келмейтінін көрсету үшінnull
annotationларды және @Nullable көмегімен әдіс қауіпсіздігі конвенцияларын анықтауға болады . Заманауи компиляторлар мен IDE-лер codeты талдау және сәйкес кеңес беру үшін осы annotationларды пайдалана алады, мысалы, үшін тексеруді өткізіп алу немесе керісінше, codeты бітеп тастайтын қажетсіз тексеруді жою мүмкіндігі туралы. Мұндай annotationларға, мысалы, IntelliJ IDE және FindBugs қолдау көрсетеді және олар JSR 305 жүйесіне де кіреді. Бірақ сіздің IDE мұндай annotationларды қолдамаса да, олар өздігінен жақсы құжаттама болады. Қарап отырсаңыз , бағдарламашыға чекті қай жерде қосу керектігін және қайда қосу керектігін түсіну оңайырақ болады. Айтпақшы, бұл Java бағдарламалаушылары арасында жаңа тәжірибе және оның таралуы үшін уақыт қажет. @NotNull
null
null
@NotNull
@Nullable
null
Кодыңыздағы қажетсіз автобокс пен автобоксты болдырмаңыз
Бұл қажетсіз уақытша нысандарды құруға әкеліп қана қоймайды, сонымен қатар қаптама класы болса, автобокс NullPointerException да шығара аладыnull
. Мысалы, егер адам жазбасында телефон нөмірі болмаса және қайтаратын болса, келесі code NullPointerException шығарады null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
Autoboxing немесе autounboxing пайдаланған кезде тек теңдіктер ғана емес, сонымен қатар <
> теңсіздіктері >
NullPointerException тудыруы мүмкін.
Конвенцияларды орындаңыз және ақылға қонымды әдепкі мәндерді анықтаңыз.
Java-да NullPointerException болдырмаудың ең жақсы тәсілдерінің бірі codeтау конвенцияларын дұрыс жариялау және орындау болып табылады. Көптеген NullPointerExceptions нысанды қажет ететін барлық деректер мен тәуелділіктерсіз жасауға әрекет жасағанда пайда болады. Аяқталмаған нысандардың жасалуын болдырмау арқылы мұндай сұрауларды сыпайы түрде қабылдамасаңыз, болашақта өзіңізді NullPointerExceptions көп санынан құтқарасыз. Сол сияқты, нысан жасауға рұқсат етсеңіз, ақылға қонымды әдепкі мәнді таңдауыңыз керек. Мысалы, класс нысанынEmployee
және атауынсыз жасау мүмкін емес id
, бірақ телефон нөмірі болмауы мүмкін. Бұл жағдайда Employee
нөмірі жоқ нысандар орнына нөлді қайтаруы мүмкін null
. Нысанның мұндай мінез-құлқын алдын ала ойластыру керек болса да - null
жоқ нөмірге қоңырау шалғаннан гөрі оны тексеру оңайырақ болуы мүмкін. Бұл жағдайда қандай өрістер бар null
және қайсысы жоқ қосымша шарттар болуы дұрыс шешім қабылдауға көмектеседі. Жалпы алғанда, бағдарламаны дереу бұзу немесе null
оны тағайындау арасындағы таңдау маңызды дизайн шешімі болып табылады және таңдау жасағаннан кейін оны дәйекті түрде орындау керек.
ДҚБЖ деңгейінде шектеулерді орнатыңыз
null
Тұтынушылар немесе Тапсырыстар сияқты бағдарлама нысандарын сақтау үшін дерекқорды пайдаланған кезде, сәйкес кесте шектеулерін пайдалана отырып, ДҚБЖ деңгейінде нысандарыңыздың «негізін» көрсеткен дұрыс . Дерекқорлар көбінесе бірнеше көздерден алынған ақпаратты қамтиды және жетіспейтін мәндерді тексеру деректеріңіздің тұтастығын жақсартады. Сонымен қатар, ДҚБЖ деңгейінде нөлге арналған тексерулердің болуы оларды Java codeыңызда азайтады: деректер базасынан Java нысандарына деректерді жүктеу арқылы олардың бар екеніне сенімді бола аласыз және != null
бағдарлама codeынан қажет емес " " алып тастай аласыз.
Нөлдік нысан үлгісін пайдаланыңыз
АрнайыNull
-an objectілерді жасау Java-да NullPointerExcpetition-ды болдырмаудың тағы бір жолы болып табылады. Біздің қолданбадағы қандай да бір әдіс оның әдістерін шақыру арқылы бағдарлама кейін жұмыс істейтін нысанды қайтарады деп есептейік. Мысалы, әдіс коллекция арқылы қайталау үшін пайдаланылатын Collection.iterator()
сынып нысанын қайтарады . Iterator
Содан кейін бастапқы нысанда итератор болмаса, оның орнына әрқашан қайтаратын әдісі бар null
арнайы -object қайтаруға болады . Міне, құрметті оқырман, мен Java бағдарламаларын NullPointerException қателерінен арылту бойынша кеңестерімді осымен аяқтаймын. Сіз бұл қарапайым және ауыртпалықсыз ережелердің қаншалықты пайдалы екенін бағалайсыз. Еске сала кетейік, егер сіз Java бағдарламаларында кез келген басқа NullPointerException трюктерін бөліскіңіз келсе, мұны түсініктемелерде жасаңыз. JavaRush студенттері үшін арнайы аударылған. ТүпнұсқаNull
hasNext()
false
GO TO FULL VERSION