Нульовий (порожній) вказівник (рідше — покажчик) — вказівник, який нікуди не вказує. Використовується для того, щоб показати, що дана змінна-вказівник ні на що не посилається. У різних мовах програмування представлений різними константами, наприклад:
- У машинних кодах: 0
- У мовах Pascal, Clipper, , Ruby, Lua : nil
- У C-подібних мовах: NULL
- У мовах Java та C#: null
- У мові : &null
- У мові Python: None
- У мові Visual Basic: Nothing
Тоні Гоар, який винайшов нульовий вказівник у 1965 році, вважає це помилкою, яка імовірно коштувала мільярди доларів, оскільки спроба розіменування нульового вказівника зазвичай приводить до збою й припинення роботи програми.
Особливості використання в різних мовах
C та C++
Макрос NULL
визначено у файлі <stddef.h>
.
ANSI C гарантує, що значення NULL еквівалентне 0, тому записи
int *a, *b; a = NULL; b = 0;
еквівалентні — вказівники a та b отримають однакове значення.
На відміну від C в Паскалі, який є дуже суворим щодо типів, Nil в жодному випадку не еквівалентний числу 0.
Java
Мова програмування Java використовує null
для позначення порожнього посилання. Також мова визначає так званий тип даних null. При спробі використання null
замість реального об'єкта віртуальна машина створює виняткову подію типу java.lang.NullPointerException
. Зокрема, ця подія виникає при:
- виклику динамічного метода об'єкта
null
. - доступі або зміні поля об'єкта
null
. - обчисленні довжини об'єкта
null
наче він є масивом. - доступі або зміні комірок об'єкта
null
наче він є масивом. - створенні виняткової ситуації з об'єктом
null
замість об'єкта типуThrowable
.
Додатки також можуть створювати виняткові ситуації типу NullPointerException
за інших невірних використаннях об'єктів типу null
.
З огляду на численні проблеми, спричинені неправильною обробкою об'єктів null
та досвіду використання деяких інших мов програмування в бібліотеці стандартних класів Java SE 8 версії був доданий контейнер Optional<T>
. Об'єкти даного класу можуть містити значення типу null
. Якщо контейнер містить непорожнє значення, тоді метод isPresent()
поверне true
а метод get()
поверне це значення. Також цей контейнер пропонує низку додаткових методів, поведінка яких залежить від наявності непорожнього значення. Наприклад, метод orElse()
повертає значення за замовченням при відсутності даних в контейнері, ifPresent()
виконує блок коду за умови наявності даних в контейнері.
Наприклад, якщо комп'ютер не має звукової карти і метод getSoundcard()
повертає null
, то при виконанні наступного коду:
String version = computer.getSoundcard().getUSB().getVersion();
виникне виняткова ситуація типу NullPointerException
при спробі викликати метод getUSB()
. Проте, засобами контейнеру Optional<T>
цей код може бути перетворений на безпечніший (після відповідного рефакторингу залучених типів даних):
String version = computer.flatMap(Computer::getSoundcard) .flatMap(Soundcard::getUSB) .map(USB::getVersion) .orElse("UNKNOWN");
унаслідок виконання якого змінна version
матиме значення «UNKNOWN» за відсутності звукової карти.
Примітки
- . Архів оригіналу за 19 січня 2009. Процитовано 23 жовтня 2010.
- Class NullPointerException. Java™ Platform Standard Ed. 8. API Specification. Oracle. 2016.
- Class Optional<T>. Java™ Platform Standard Ed. 8. API Specification. Oracle. 2016.
- Raoul-Gabriel Urma (March 2014). Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!. Oracle Technology Network.
Див. також
Посилання
- CWE-476: NULL Pointer Dereference
- Quora: What actually happens when dereferencing a NULL pointer?
Це незавершена стаття про мови програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina NULL Nulovij porozhnij vkazivnik ridshe pokazhchik vkazivnik yakij nikudi ne vkazuye Vikoristovuyetsya dlya togo shob pokazati sho dana zminna vkazivnik ni na sho ne posilayetsya U riznih movah programuvannya predstavlenij riznimi konstantami napriklad U mashinnih kodah 0 U movah Pascal Clipper Ruby Lua nil U C podibnih movah NULL U movah Java ta C null U movi amp null U movi Python None U movi Visual Basic Nothing Toni Goar yakij vinajshov nulovij vkazivnik u 1965 roci vvazhaye ce pomilkoyu yaka imovirno koshtuvala milyardi dolariv oskilki sproba rozimenuvannya nulovogo vkazivnika zazvichaj privodit do zboyu j pripinennya roboti programi Osoblivosti vikoristannya v riznih movahC ta C Dokladnishe NULL C C mova programuvannya C ta Pomilka segmentaciyi Makros NULL viznacheno u fajli lt stddef h gt ANSI C garantuye sho znachennya NULL ekvivalentne 0 tomu zapisi int a b a NULL b 0 ekvivalentni vkazivniki a ta b otrimayut odnakove znachennya Na vidminu vid C v Paskali yakij ye duzhe suvorim shodo tipiv Nil v zhodnomu vipadku ne ekvivalentnij chislu 0 Java Dokladnishe Java Mova programuvannya Java vikoristovuye null dlya poznachennya porozhnogo posilannya Takozh mova viznachaye tak zvanij tip danih null Pri sprobi vikoristannya null zamist realnogo ob yekta virtualna mashina stvoryuye vinyatkovu podiyu tipu java lang NullPointerException Zokrema cya podiya vinikaye pri vikliku dinamichnogo metoda ob yekta null dostupi abo zmini polya ob yekta null obchislenni dovzhini ob yekta null nache vin ye masivom dostupi abo zmini komirok ob yekta null nache vin ye masivom stvorenni vinyatkovoyi situaciyi z ob yektom null zamist ob yekta tipu Throwable Dodatki takozh mozhut stvoryuvati vinyatkovi situaciyi tipu NullPointerException za inshih nevirnih vikoristannyah ob yektiv tipu null Z oglyadu na chislenni problemi sprichineni nepravilnoyu obrobkoyu ob yektiv null ta dosvidu vikoristannya deyakih inshih mov programuvannya v biblioteci standartnih klasiv Java SE 8 versiyi buv dodanij kontejner Optional lt T gt Ob yekti danogo klasu mozhut mistiti znachennya tipu null Yaksho kontejner mistit neporozhnye znachennya todi metod isPresent poverne true a metod get poverne ce znachennya Takozh cej kontejner proponuye nizku dodatkovih metodiv povedinka yakih zalezhit vid nayavnosti neporozhnogo znachennya Napriklad metod orElse povertaye znachennya za zamovchennyam pri vidsutnosti danih v kontejneri ifPresent vikonuye blok kodu za umovi nayavnosti danih v kontejneri Napriklad yaksho komp yuter ne maye zvukovoyi karti i metod getSoundcard povertaye null to pri vikonanni nastupnogo kodu String version computer getSoundcard getUSB getVersion vinikne vinyatkova situaciya tipu NullPointerException pri sprobi viklikati metod getUSB Prote zasobami kontejneru Optional lt T gt cej kod mozhe buti peretvorenij na bezpechnishij pislya vidpovidnogo refaktoringu zaluchenih tipiv danih String version computer flatMap Computer getSoundcard flatMap Soundcard getUSB map USB getVersion orElse UNKNOWN unaslidok vikonannya yakogo zminna version matime znachennya UNKNOWN za vidsutnosti zvukovoyi karti Primitki Arhiv originalu za 19 sichnya 2009 Procitovano 23 zhovtnya 2010 Class NullPointerException Java Platform Standard Ed 8 API Specification Oracle 2016 Class Optional lt T gt Java Platform Standard Ed 8 API Specification Oracle 2016 Raoul Gabriel Urma March 2014 Tired of Null Pointer Exceptions Consider Using Java SE 8 s Optional Oracle Technology Network Div takozhVkazivnik Neviznachena povedinkaPosilannyaCWE 476 NULL Pointer Dereference Quora What actually happens when dereferencing a NULL pointer Ce nezavershena stattya pro movi programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi