JavaRush /Java блогы /Random-KK /Тапсырмалар мен кеңестер. Java қолданбаларында NullPointe...
DarthVictor
Деңгей

Тапсырмалар мен кеңестер. Java қолданбаларында NullPointerException қалай болдырмауға болады

Топта жарияланған
Тапсырмалар мен кеңестер.  Java қолданбаларында NullPointerException қалай болдырмауға болады - 1Бүгін мен сізге қолданбаларыңызда NullPointerException қалай болдырмауға болатыны туралы қарапайым әдістерді көрсетемін. Оларды орындау оңай, бірақ codeыңыздың сенімділігі мен сапасын айтарлықтай жақсартады. Сонымен қатар, менің тәжірибемде бірінші кеңес сіздің codeыңыздың сапасына айтарлықтай әсер етеді. Егер сіз Java бағдарламалаудың басқа амалдарын білсеңіз, оларды түсініктемелерде бөлісіңіз. Тапсырмалар мен кеңестер.  Java қолданбаларында NullPointerException қалай болдырмауға болады - 2

Белгісіз нысанның орнына белгілі жол литералында equals() және equalsIgnoreCase() әдістерін шақырыңыз

equals()Әрқашан сіз білетін белгілі жолдағы әдісті шақырыңыз null. Әдіс equals()симметриялы, яғни шақырады a.equals(b)және b.equals(a)бірдей нәтиже береді (егер aжәне bжоқ болса ), және осы себепті көптеген бағдарламашылар қандай an objectілердің y немесе y nullдеп аталатынына назар аудармайды . Мұның жанама әсерлерінің бірі, егер әдіс шақырылса, NullPointerException болып табылады . 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");
}
Бұл NullPointerException болдырмаудың ең қарапайым кеңесі болды, бірақ оның өзі үлкен жақсартуға әкеледі, себебі әдіс equals()барлық жерде кездеседі.

Екеуі де бірдей нәтиже беретін жағдайларда toString() орнына valueOf() мәнін таңдаңыз

toString()Мәні бар сілтемеге қоңырау шалу NullPointerException жіберетіндіктен, біз бірдей нәтижеге қол жеткізген кезде nullқоңырау шалуды пайдаланған дұрыс , өйткені қайтару арқылы қоңырау шалу . Бұл әсіресе , , немесе сияқты орауыш сыныптарына қатысты . 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"
Нысанның бар-жоқтығына сенімді болмасаңыз, осы кеңестерді пайдаланыңыз null.

nullҚауіпсіз әдістер мен кітапханаларды пайдаланыңыз

Тестілеудің ауыр жүгін көтеретін көптеген ашық бастапқы кітапханалар бар null. Ең көп таралғандардың бірі - StringUtilsApache 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ларын пайдаланыңыз

Әдістеріңіздің сипаттамасында әдістің қайтара алатынын немесе келмейтінін көрсету үшін nullannotationларды және @Nullable көмегімен әдіс қауіпсіздігі конвенцияларын анықтауға болады . Заманауи компиляторлар мен IDE-лер codeты талдау және сәйкес кеңес беру үшін осы annotationларды пайдалана алады, мысалы, үшін тексеруді өткізіп алу немесе керісінше, codeты бітеп тастайтын қажетсіз тексеруді жою мүмкіндігі туралы. Мұндай annotationларға, мысалы, IntelliJ IDE және FindBugs қолдау көрсетеді және олар JSR 305 жүйесіне де кіреді. Бірақ сіздің IDE мұндай annotationларды қолдамаса да, олар өздігінен жақсы құжаттама болады. Қарап отырсаңыз , бағдарламашыға чекті қай жерде қосу керектігін және қайда қосу керектігін түсіну оңайырақ болады. Айтпақшы, бұл Java бағдарламалаушылары арасында жаңа тәжірибе және оның таралуы үшін уақыт қажет. @NotNullnullnull@NotNull@Nullablenull

Кодыңыздағы қажетсіз автобокс пен автобоксты болдырмаңыз

Бұл қажетсіз уақытша нысандарды құруға әкеліп қана қоймайды, сонымен қатар қаптама класы болса, автобокс 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 студенттері үшін арнайы аударылған. ТүпнұсқаNullhasNext()false
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION