Бүгүн мен сизге тиркемелериңизде NullPointerException кантип алдын алуу боюнча жөнөкөй ыкмаларды көрсөтөм. Аларды аткаруу оңой, бирок codeуңуздун ишенимдүүлүгүн жана сапатын бир топ жакшыртат. Мындан тышкары, менин тажрыйбам боюнча, биринчи кеңеш сиздин codeуңуздун сапатына олуттуу таасирин тийгизет. Эгерде сиз башка Java программалоо ыкмаларын билсеңиз, аларды комментарийлерде бөлүшүңүз.
Көптөгөн ачык булактуу китепканалар бар, алар тестирлөөнүн оор жүгүн алышат Бир ыкмадан кайтып келбегенге аракет кылыңыз
Бул Джошуа Блок өзүнүн Java: Натыйжалуу программалоо китебинде сүрөттөгөн дагы бир жакшы Java программалоо кеңеши.
Белгисиз an objectтин ордуна белгилүү сап литералында 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
Бирок, колдонуудан мурун, коопсуз методдор менен класстардын 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ларын колдонуңуз
Методдоруңуздун сыпатталышында ыкманын кайтарып бере алабы же жокпу,null
annotationларды жана @Nullable аркылуу методдун коопсуздук конвенцияларын аныктай аласыз . Заманбап компиляторлор жана IDEлер бул annotationларды codeуңузду талдоо жана тиешелүү кеңештерди берүү үчүн колдонушу мүмкүн, мисалы, үчүн чекти өткөрүп жиберүү же тескерисинче, codeду бүтөп жаткан керексиз текшерүүнү алып салуу мүмкүнчүлүгү жөнүндө. Мындай annotationларды, мисалы, IntelliJ IDE жана FindBugs колдойт жана алар JSR 305ке да кирет. Бирок сиздин IDE мындай annotationларды колдобосо дагы, алар өз алдынча жакшы documentация болот. Карап көрсөк , программист каякка чекти кошуп, кайсы жерде кошпосо болорун түшүнүү оңой болот . Айтмакчы, бул Java программисттеринин арасында жаңы практика болуп саналат жана аны жайылтуу үчүн убакыт талап кылынат. @NotNull
null
null
@NotNull
@Nullable
null
Кодуңуздагы керексиз автобокс жана автобокстоодон качыңыз
Бул керексиз убактылуу 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 студенттери үчүн атайын которулган. OriginalNull
hasNext()
false
GO TO FULL VERSION