JavaRush /Блоги Java /Random-TG /Ҳилаҳо ва маслиҳатҳо. Чӣ тавр бояд NullPointerException д...
DarthVictor
Сатҳи

Ҳилаҳо ва маслиҳатҳо. Чӣ тавр бояд NullPointerException дар барномаҳои Java канорагирӣ кард

Дар гурӯҳ нашр шудааст
Ҳилаҳо ва маслиҳатҳо.  Чӣ тавр аз NullPointerException дар барномаҳои Java канорагирӣ кардан мумкин аст - 1Имрӯз ман ба шумо усулҳои оддиро дар бораи пешгирӣ кардани NullPointerException дар замимаҳои худ нишон медиҳам. Онҳоро риоя кардан осон аст, аммо эътимоднокӣ ва сифати рамзи шуморо ба таври назаррас беҳтар мекунад. Гузашта аз ин, дар таҷрибаи ман, нӯги аввал ба сифати рамзи шумо таъсири назаррас хоҳад дошт. Агар шумо ягон ҳиллаҳои дигари барномасозии Java-ро донед, озодона онҳоро дар шарҳҳо мубодила кунед. Ҳилаҳо ва маслиҳатҳо.  Чӣ тавр аз NullPointerException дар барномаҳои Java канорагирӣ кардан мумкин аст - 2

Методҳои equals() ва equalsIgnoreCase() -ро дар сатри маълум ба ҷои an objectи номаълум занг занед

Ҳамеша усулеро 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()дар ҳама ҷо пайдо мешавад.

Дар ҳолатҳое, ки ҳарду натиҷаи якхела медиҳанд, valueOf() -ро бар toString() интихоб кунед

Азбаски занг задан toString()ба истинод бо арзиш nullNullPointerException-ро мепартояд, беҳтар аст зангро истифода барем, 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"
Ин маслиҳатҳоро вақте истифода баред, ки шумо боварӣ надоред, ки оё an object мавҷуд аст 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: Барномасозии муассир тавсиф мекунад. Ҳангоми баргардонидани коллексияҳо ё массивҳои холӣ, боварӣ ҳосил кунед, ки даъват кардани усулҳои асосӣ ба NullPointerException монанд аст size()ё 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 -ро истифода баред

Дар тавсифи усулҳои худ, шумо метавонед nullконвенсияҳои бехатарии усулҳоро бо истифода аз эзоҳҳо @NotNullва @Nullable муайян кунед, то нишон диҳед, ки оё усул бармегардад nullё не. Компиляторҳо ва IDE-ҳои муосир метавонанд ин эзоҳҳоро барои таҳлor рамзи шумо истифода баранд ва маслиҳатҳои мувофиқ диҳанд, масалан, дар бораи гум кардани чек nullё баръакс, дар бораи имкони нест кардани чеки нолозим, ки codeро банд мекунад. Чунин эзоҳҳоро, масалан, IntelliJ IDE ва FindBugs дастгирӣ мекунанд ва онҳо инчунин ба JSR 305 дохил карда шудаанд. Аммо ҳатто агар IDE-и шумо ин гуна эзоҳҳоро дастгирӣ накунад, онҳо дар худ ҳуҷҷатгузории хуб хоҳанд буд. Нигоҳ кунед @NotNullва @Nullableбарои барномасоз фаҳмидани он осонтар хоҳад буд, ки дар куҷо чек илова кардан лозим аст nullва дар куҷо не. Дар омади гап, ин як таҷрибаи нав дар байни барномасозони Java аст ва барои паҳн шудани он вақт лозим аст.

Дар codeи худ аз автобоксҳои нолозим ва худкоркунак худдорӣ кунед

Ин на танҳо боиси эҷоди an objectҳои муваққатии нолозим мегардад, балки autoboxing инчунин метавонад NullPointerException -ро партояд, агар синфи печанда бошад null. Масалан, рамзи зерин NullPointerException-ро мепартояд, агар вуруди шахс рақами телефонро дар бар нагирад ва null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Ҳангоми истифодаи autoboxing ё autounboxing, на танҳо баробарӣ, балки нобаробарӣ <> >метавонад боиси NullPointerException гардад.

Конвенсияҳоро риоя кунед ва пешфарзҳои оқилонаро муайян кунед.

Яке аз роҳҳои беҳтарини пешгирӣ аз NullPointerException дар Java ин дуруст эълон ва риояи конвенсияҳои рамзгузорӣ мебошад. Аксари NullPointerExceptions вақте рух медиҳанд, ки шумо кӯшиши эҷод кардани an objectро бидуни доштани тамоми маълумот ва вобастагии он талаб мекунад. Бо пешгирӣ кардани эҷоди an objectҳои нотамом тавассути рад кардани чунин дархостҳо, шумо худро дар оянда аз шумораи зиёди NullPointerExceptions наҷот медиҳед. Ба ҳамин монанд, агар шумо ба эҷоди an object иҷозат диҳед, шумо бояд арзиши оқилонаи пешфарзро интихоб кунед. Масалан, an objectи синфро Employeeбе ном ва сохтан мумкин нест id, аммо рақами телефон надошта бошад. Дар ин ҳолат an objectҳои Employeeбидуни рақам метавонанд ба ҷои сифр баргарданд null. Ҳарчанд чунин рафтори an objectро пешакӣ фикр кардан лозим аст - тафтиш кардани он метавонад нисбат ба nullзанг задан ба рақами мавҷуда осонтар бошад. Дар ин ҳолат, доштани шароити иловагӣ, ки дар кадом майдонҳо ҳастанд nullва кадоме не, барои қабули қарори дуруст кӯмак мекунад. Умуман, интихоби байни фавран вайрон кардани барнома ё таъин кардани nullон як қарори муҳими тарроҳӣ аст ва вақте ки шумо интихоб кардед, шумо бояд онро пайваста риоя кунед.

Маҳдудиятҳоро дар сатҳи DBMS муқаррар кунед

Ҳангоми истифодаи пойгоҳи додаҳо барои нигоҳ доштани an objectҳои барномаи шумо, аз қабor Муштариён ё Фармоишҳо, nullбо истифода аз маҳдудиятҳои мувофиқи ҷадвал "неси" -и an objectҳои худро дар сатҳи DBMS муайян кардан оқилона аст. Пойгоҳи додаҳо аксар вақт маълумотро аз сарчашмаҳои гуногун дар бар мегиранд ва ҷорӣ намудани санҷишҳо барои арзишҳои гумшуда тамомияти маълумоти шуморо беҳтар мекунад. Илова бар ин, мавҷудияти чекҳои null дар сатҳи DBMS онҳоро дар codeи Java-и шумо кам мекунад: бо бор кардани маълумот аз базаи маълумот ба an objectҳои Java, шумо метавонед ба мавҷудияти онҳо боварӣ ҳосил кунед ва " " -и нолозимро != nullаз codeи барнома хориҷ кунед.

Намунаи an objectи нулро истифода баред

Эҷоди Null-an objectҳои махсус роҳи дигари пешгирӣ кардани NullPointerExcpetion дар Java мебошад. Фарз мекунем, ки ягон усул дар замимаи мо an objectеро бармегардонад, ки барнома баъдан бо даъвати усулҳои худ кор мекунад. Масалан, усул Collection.iterator()an objectи синфро бар мегардонад Iterator, ки барои такрор кардани коллексия истифода мешавад. Пас, агар an objectи аслӣ ягон итератор надошта бошад, nullшумо метавонед ба ҷои он -an objectи махсусеро баргардонед Null, ки методе hasNext()ҳамеша баргардонад false. Ин ҳама, хонандаи азиз, ман дар ин ҷо маслиҳатҳои худро оид ба бартараф кардани барномаҳои Java аз хатогиҳои NullPointerException хотима медиҳам. Шумо дарк хоҳед кард, ки ин қоидаҳои оддӣ ва на сарборӣ то чӣ андоза муфид буда метавонанд. Ҳамчун ёдоварӣ, агар шумо хоҳед, ки ҳиллаҳои дигари NullPointerException-ро дар барномаҳои Java мубодила кунед, озодона инро дар шарҳҳо иҷро кунед. Махсусан барои донишҷӯёни JavaRush тарҷума шудааст. Асли
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION