9 Речей про null в java

9 речей про NULL в Java.

9 Things about Null in Java

Java і null нерозривно пов'язані. Чи існує Java-програміст, не зустрічався з "null pointer exception" і це сумний факт. Навіть винахідник концепції "null" назвав її своєю помилкою на мільярд доларів, тоді навіщо Java підтримує її? null був тут довгий час, і я вважаю, творці Java знають, що він створює більше проблем ніж вирішує, так чому ж вони все ще миряться з цим. І це дивує мене ще більше, тому що філософією Java було спростити речі, ось чому вони більше не возяться з покажчиками, перевантаженням операторів і множинним спадкуванням, але чому null.

Ну, я дійсно не знаю відповідь на це питання, але, що я точно знаю, не має значення скільки б null критикувався Java-програмістами і open-source спільнотою, ми повинні жити з ним. Замість того щоб шкодувати, краще пізнати більше і бути впевненим що ми використовуємо null правильно.
Чому Ви повинні дізнатися про null в Java?
Тому що, якщо Ви не звернете уваги на null. будьте впевнені, Java змусить страждати від жахливого java.lang.NullPointerException і Ви вивчите цей урок, але підете більш важким шляхом. Написання стійкого до «падінь» коду - це мистецтво і Ваша команда, замовники і користувачі оцінять це. З мого досвіду, одна з основних причин NullPointerException це недолік знань про null в Java. Багато з Вас вже знайомі з null, інші зможу дізнатися деякі старі і нові речі про ключове слово null. Давайте повторимо або дізнаємося деякі важливі речі про null в Java.

Що є null в Java


Як я говорив, null дуже-дуже важлива концепція в Java. Спочатку він був винайдений для позначення відсутності чогось, наприклад, відсутність користувача, ресурсу або чого завгодно, але вже протягом року спантеличив Java-програмістів безліччю null pointer exception. У цьому уроці, ми дізнаємося основні факти про ключове слово null в Java, вивчимо деякі прийоми як уникнути неприємностей з null pointer exceptions і мінімізувати перевірки на null.

  1. Насамперед, null це ключове слово в Java, так само як public. static або final. Регістр враховується, Ви не можете писати null як Null або NULL. компілятор не розпізнає його і буде викинута помилка.

Найчастіше, з цим зустрічаються програмісти, які перейшли з інших мов програмування, але при використанні сучасних IDE проблема стає незначною. У наші дні, IDE на зразок Eclipse або NetBeans можуть виправляти цю помилку поки Ви набираєте код, але в епоху Notepad. Vim і Emaks. це була поширена проблема, яка могла з'їсти купу дорогоцінного часу.

  • Так само, як кожен примітив має значення за замовчуванням, наприклад, у int це 0. у boolean це false. null це значення за замовчуванням будь-яких довідкових типів, простіше кажучи, для всіх об'єктів. Так само, як при створенні логічної змінної її значення за замовчуванням дорівнює false. так і будь-які довідкові змінні в Java за замовчуванням будуть рівні null. Це істинно для всіх типів змінних: змінної-члена або локальної змінної, змінної примірника або статичної змінної, крім того, компілятор буде лаятися, якщо Ви використовуєте локальну Змінна не проініціалізувати її.

    Це істинно як для статичних, так й у в повному статичних об'єктів, як Ви можете бачити тут, я зробив myObj статичної посиланням, так що я можу використовувати її безпосередньо в методі main, який є статичним методом і не дозволяє звертатися до не статичною змінним зсередини.

  • Незважаючи на поширену оману, null це не об'єкт (Object) і ні тип. Це просто спеціальне значення, яке може бути призначено будь-якого посилальному типу, і Ви можете привести null до будь-якого типу, як показано нижче:

    Як Ви можете бачити, приведення null до будь-якого посилальному типу пройде успішно як під час компіляції, так і під час виконання програми. На відміну від того, що багато хто з Вас можливо подумали, це не призведе до викидання NullPointerException.

  • null може бути призначений тільки посилальному типу, Ви не можете призначити null примітивної змінної на кшталт int. double. float або boolean. Компілятор висловить Вам своє невдоволення якщо Ви зробите як показано нижче:

    Як Ви можете бачити, коли ми безпосередньо присвоюємо null примітиву, то отримуємо помилку процесу компіляції, але, якщо привласнити null об'єкту класу-обгортки, а потім привласнити цей об'єкт відповідного примітивного типу, компілятор не відреагує, але ми будемо винагороджені null pointer exception під час виконання. Це відбувається через авто упаковки (autoboxing) (autoboxing) в Java, і ми ще зустрінемося з ним у наступному пункті.

  • Будь-клас-обгортка зі значенням null викидатиме java.lang.NullPointerException коли Java розпакує (unbox) його в примітивну змінну. Деякі програмісти роблять помилку допускаючи, що авто упаковка (autoboxing) подбає про конвертацію null в значення за замовчуванням для відповідного примітивного типу, наприклад, 0 для int. false для boolean і т.д. але це не вірно, в чому можна переконатися нижче:

    Але, коли Ви запустите даний фрагмент коду, в консолі Ви побачите

    Це часто відбувається при роботі з HashMap і Integer key. Виконання коду, показаного нижче перерветься, як тільки Ви його запустите.

    Цей код виглядає дуже простим і нешкідливим. Ви просто підраховуєте скільки разів число зустрічається в масиві, класична техніка знаходження дублікатів. Розробник бере попереднє підрахувати кількість, збільшує його на одиницю і вставляє назад в Map. Він міг би подумати, що авто-упаковка подбає про перетворення Integer в int. як це робиться в момент виклику методу put (). але він забуває, що якщо для числа підрахунок ще не проводився, метод get () поверне з HashMapnull. НЕ нуль, тому що значення за замовчуванням для Integer це null. а не 0. і авто-упаковка викине null pointer exception при спробі конвертувати Integer в змінну int.

  • Оператор instanceof буде повертати false якщо в якості параметра вказати будь-яку кількість посилань змінну зі значенням null або null сам по собі. приклад:


    Це важлива властивість оператора instanceof. яке робить його корисним для перевірки приведення типів.

  • Ви знаєте, що ви не можете викликати нестатичних метод у посилальної змінної зі значенням null. це викличе NullPointerException. але Ви можете не знати, що Ви можете викликати статичний методу у посилальної змінної зі значенням null. Оскільки статичні методи використовують статичну зв'язування, вони не викидають NullPointerException. Ось приклад:
  • Ви можете надіслати null як параметр методу, що приймає будь-який контрольний тип, наприклад:

    може бути викликаний як

    Це нормально з точки зору компілятора, але подальша поведінка повністю залежить від методу. Null-безпечний метод не викине NullPointerException. а просто коректно завершиться. Якщо бізнес логіка дозволяє, рекомендується писати null-безпечні методи.

  • Ви можете порівнювати null використовуючи оператори == (дорівнює) і! = (Не дорівнює), але не можете використовувати його з іншими арифметичними або логічними операторами, на кшталт <(меньше) или> (Більше). На відміну від SQL, в Java null == null поверне true. як показано нижче:


  • Це все про null в Java. Напрацювавши деякий досвід в Java-програмуванні і використовуючи прості прийоми, щоб уникнути NullPointerException. Ви зможете зробити Ваш код безпечним. Оскільки значення null може розглядатися як пусте або неініціалізованих значення, це часто є джерелом плутанини, ось чому так важливо документувати поведінку методу при вхідному значенні null. Завжди пам'ятайте, null це значення за замовчуванням довідкових змінних, і Ви не можете викликати методи екземпляра або отримувати доступ до змінних екземпляра використовуючи null-посилання в Java.