JavaRush /Java блогу /Random-KY /Фокустар жана кеңештер. Java колдонмолорунда NullPointerE...
DarthVictor
Деңгээл

Фокустар жана кеңештер. Java колдонмолорунда NullPointerException кантип сактанса болот

Группада жарыяланган
Фокустар жана кеңештер.  Java тиркемелеринде NullPointerException кантип качса болот - 1Бүгүн мен сизге тиркемелериңизде NullPointerException кантип алдын алуу боюнча жөнөкөй ыкмаларды көрсөтөм. Аларды аткаруу оңой, бирок codeуңуздун ишенимдүүлүгүн жана сапатын бир топ жакшыртат. Мындан тышкары, менин тажрыйбам боюнча, биринчи кеңеш сиздин codeуңуздун сапатына олуттуу таасирин тийгизет. Эгерде сиз башка Java программалоо ыкмаларын билсеңиз, аларды комментарийлерде бөлүшүңүз. Фокустар жана кеңештер.  Java тиркемелеринде NullPointerException кантип качса болот - 2

Белгисиз an objectтин ордуна белгилүү сап литералында 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 Бирок, колдонуудан мурун, коопсуз методдор менен класстардын documentтерин окууну унутпаңыз . Бул көп күч-аракетти талап кылбастан, чоң жакшыртууга алып келген эң мыкты 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лер бул annotationларды codeуңузду талдоо жана тиешелүү кеңештерди берүү үчүн колдонушу мүмкүн, мисалы, үчүн чекти өткөрүп жиберүү же тескерисинче, codeду бүтөп жаткан керексиз текшерүүнү алып салуу мүмкүнчүлүгү жөнүндө. Мындай annotationларды, мисалы, IntelliJ IDE жана FindBugs колдойт жана алар JSR 305ке да кирет. Бирок сиздин IDE мындай annotationларды колдобосо дагы, алар өз алдынча жакшы documentация болот. Карап көрсөк , программист каякка чекти кошуп, кайсы жерде кошпосо болорун түшүнүү оңой болот . Айтмакчы, бул Java программисттеринин арасында жаңы практика болуп саналат жана аны жайылтуу үчүн убакыт талап кылынат. @NotNullnullnull@NotNull@Nullablenull

Кодуңуздагы керексиз автобокс жана автобокстоодон качыңыз

Бул керексиз убактылуу an objectтердин түзүлүшүнө гана алып келбестен, автобоксинг, эгерде орогуч классы болсо, NullPointerException да ыргыта алат null. Мисалы, төмөнкү code NullPointerException ыргытат, эгерде адам жазуусу телефон номерин камтыбаса жана кайтарса null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Autoboxing же autounboxing колдонууда теңдик гана эмес, ошондой эле теңсиздик <> >NullPointerException алып келиши мүмкүн.

Конвенцияларды сактаңыз жана акылга сыярлык демейкилерди аныктаңыз.

Java'да NullPointerExceptionдон сактануунун эң жакшы жолдорунун бири codeдоо конвенцияларын туура жарыялоо жана сактоо. Көпчүлүк NullPointerExceptions an objectти талап кылган бардык маалыматтар жана көз карандылыктарсыз түзүүгө аракет кылганыңызда пайда болот. Мындай суроо-талаптарды кылдаттык менен четке кагуу менен бүтпөгөн an objectтердин түзүлүшүнө жол бербөө менен, келечекте NullPointerExceptions көп сандагы өзүңүздү сактап каласыз. Ошо сыяктуу эле, an object түзүүгө уруксат берсеңиз, демейки мааниге ээ болгон маанини тандаңыз. Мисалы, класс an objectисин жана Employeeаты жок түзүлбөйт id, бирок телефон номери болбошу мүмкүн. Бул учурда, Employeeсаны жок an objectтер ордуна нөлдү кайтарышы мүмкүн null. Объекттин мындай жүрүм-турумун алдын ала ойлонуу керек да - nullжок номерге чалууга караганда текшерүү оңой болушу мүмкүн. Бул учурда кайсы талаалар бар nullжана кайсынысы жок кошумча шарттарга ээ болуу туура чечим чыгарууга жардам берет. Жалпысынан алганда, программаны дароо бузуп салуу же nullаны дайындоо ортосундагы тандоо маанилүү долбоорлоо чечими болуп саналат жана сиз тандап алгандан кийин, аны ырааттуу түрдө аткарышыңыз керек.

DBMS деңгээлинде чектөөлөрдү коюңуз

Кардарлар же Заказдар сыяктуу программалык an objectилериңизди сактоо үчүн берorштер базасын колдонууда, nullтиешелүү table чектөөлөрүн колдонуу менен DBMS деңгээлинде an objectтериңиздин "негиздигин" көрсөтүү туура болот. Берorштер базалары көбүнчө бир нече булактардан алынган маалыматты камтыйт жана жетишпеген маанилерди текшерүү маалыматтарыңыздын бүтүндүгүн жакшыртат. Мындан тышкары, СББД деңгээлинде нөл үчүн текшерүүлөрдүн болушу аларды Java codeуңузда азайтат: берorштер базасынан Java an objectилерине маалыматтарды жүктөө менен, сиз алардын бар экенине ынанып, != nullпрограммалык codeдон керексиз " " алып салсаңыз болот.

Нөл an object үлгүсүн колдонуңуз

Атайын Null-objects түзүү - Java'да NullPointerExcpetion болтурбоо үчүн дагы бир жолу. Келгиле, биздин тиркемедеги кандайдыр бир метод, анын методдорун чакыруу менен программа кийинчерээк иштей турган an objectти кайтарат деп ойлойлу. Мисалы, метод коллекция аркылуу итерациялоо үчүн колдонулган Collection.iterator()класстын an objectисин кайтарат . IteratorАндан кийин баштапкы an objectте эч кандай итератор жок болсо, анын ордуна ар дайым кайтаруучу ыкмасы бар nullатайын -object кайтара аласыз . Ушунун баары, урматтуу окурман, ушул жерден мен Java программаларын NullPointerException каталарынан арылтуу боюнча кеңештеримди аяктайм. Бул жөнөкөй жана оор эмес эрежелер канчалык пайдалуу экенин баалайсыз. Эскерте кетсек, эгер сиз Java программаларында башка NullPointerException трюктары менен бөлүшкүңүз келсе, комментарийлерде тартынбаңыз. JavaRush студенттери үчүн атайын которулган. OriginalNullhasNext()false
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION