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.
- Насамперед, null це ключове слово в Java, так само як public. static або final. Регістр враховується, Ви не можете писати null як Null або NULL. компілятор не розпізнає його і буде викинута помилка.
Найчастіше, з цим зустрічаються програмісти, які перейшли з інших мов програмування, але при використанні сучасних IDE проблема стає незначною. У наші дні, IDE на зразок Eclipse або NetBeans можуть виправляти цю помилку поки Ви набираєте код, але в епоху Notepad. Vim і Emaks. це була поширена проблема, яка могла з'їсти купу дорогоцінного часу.
Це істинно як для статичних, так й у в повному статичних об'єктів, як Ви можете бачити тут, я зробив myObj статичної посиланням, так що я можу використовувати її безпосередньо в методі main, який є статичним методом і не дозволяє звертатися до не статичною змінним зсередини.
Як Ви можете бачити, приведення null до будь-якого посилальному типу пройде успішно як під час компіляції, так і під час виконання програми. На відміну від того, що багато хто з Вас можливо подумали, це не призведе до викидання NullPointerException.
Як Ви можете бачити, коли ми безпосередньо присвоюємо null примітиву, то отримуємо помилку процесу компіляції, але, якщо привласнити null об'єкту класу-обгортки, а потім привласнити цей об'єкт відповідного примітивного типу, компілятор не відреагує, але ми будемо винагороджені null pointer exception під час виконання. Це відбувається через авто упаковки (autoboxing) (autoboxing) в Java, і ми ще зустрінемося з ним у наступному пункті.
Але, коли Ви запустите даний фрагмент коду, в консолі Ви побачите
Це часто відбувається при роботі з HashMap і Integer key. Виконання коду, показаного нижче перерветься, як тільки Ви його запустите.
Цей код виглядає дуже простим і нешкідливим. Ви просто підраховуєте скільки разів число зустрічається в масиві, класична техніка знаходження дублікатів. Розробник бере попереднє підрахувати кількість, збільшує його на одиницю і вставляє назад в Map. Він міг би подумати, що авто-упаковка подбає про перетворення Integer в int. як це робиться в момент виклику методу put (). але він забуває, що якщо для числа підрахунок ще не проводився, метод get () поверне з HashMapnull. НЕ нуль, тому що значення за замовчуванням для Integer це null. а не 0. і авто-упаковка викине null pointer exception при спробі конвертувати Integer в змінну int.
Це важлива властивість оператора instanceof. яке робить його корисним для перевірки приведення типів.
може бути викликаний як
Це нормально з точки зору компілятора, але подальша поведінка повністю залежить від методу. Null-безпечний метод не викине NullPointerException. а просто коректно завершиться. Якщо бізнес логіка дозволяє, рекомендується писати null-безпечні методи.