В даному матеріалі ми розберемо що таке NullPointerException: як зрозуміти таку помилку, так як виправляти.
Помилки при програмуванні неминучі. Для хорошого розробника дуже важливо вміти знаходити і вчасно їх виправляти.
NullPointerException – найпоширеніша помилка Java. Вона виникає, коли об’єкт не ініціалізовано і при цьому з ним намагаються проводити певні операції. Якщо спробувати перекласти фразу null pointer exception, то вийде виключення нульового покажчика.
Давайте повернемося трохи до теорії класів у мові Java. Адже нам відомо, що клас це і є об’єкт. Щоб створити новий об’єкт, нам потрібно:
позначити його тип, ім’я, написати ключове слово new, викликати конструктор класу. У деяких випадках можна не писати new. Наприклад, коли ми працюємо з рядками, можна написати просто String a = “Hi there”;
По суті після знаку рівності (=) ми фактично присвоюємо значення нашому об’єкту. У мові Java є ключове слово null. Спочатку воно було створене для позначення відсутності об’єкта. Використовуючи дане ключове слово, ми можемо “частково” створити об’єкт. Наприклад, коли поки не знаємо, яке буде його значення:
String a = null; Програма буде працювати, але як тільки ми спробуємо щось зробити з об’єктом, який вказує на null, ми відразу отримаємо NullPointerException:
public class NullPointerExample { public static void main(String[] args) { String a = null; a.length(); } }

Побачивши приклад вище, можна поставити резонне запитання: хто при здоровому глузді буде писати спеціально null, щоб зловити NullPointerException. Але ж у Вас вийшло це зробити?) Інакше на цю статтю Ви б не потрапили.
Не все так однозначно і не поспішайте дорікати собі і шукати в коді явне написання null.
NullPointerException може виникати навіть тоді, коли Ви явно нічого такого не прописували в коді. Але дана помилка виникає завжди через покажчик на null.
Тепер саме час згадати, як в Java відбувається ініціалізація змінних різних типів. Для полів класу ініціалізація відбувається “за замовчуванням”. І для об’єктів змінні ініціалізуються null значенням. Ось чому у нас часто виникає NullPointerException навіть, коли ми явно нічого не прописували в коді.
До речі, творець поняття null, Тоні Хоар на одній з конференцій вибачився за свій винахід. І сказав, що це “Помилка на мільярд доларів”.
Якщо в методі і потрібно явно прописувати значення змінної (інакше компілятор просто не запустить програму), то в класі прописувати значення явно необов’язково. Воно буде створено за замовчуванням:

І якщо примітивні типи даних за замовчуванням ініціалізуються значеннями, то об’єкти отримують null.
При спробі викликати будь-який метод або поле таких об’єктів, ми отримаємо NullPointerException.
Тепер, коли ми знаємо про причини виникнення вищеописаної помилки, можна починати шукати способи її уникнення.
Як уникати NullPointerException
Найпростіший, очевидний і єдиний спосіб – це перевірка об’єкта на null перед тим, як виконувати над ним операції:
public class NullPointerExample { static String a; static int b; static double c; static boolean d; public static void main(String[] args) { int aLength; if(a == null) { System.out.println("Can't perform actions with variable a. Because it's null"); aLength = 0; } else { aLength = a.length(); } System.out.println(aLength); } }
Подібною перевіркою ми завжди можемо бути впевнені, що програма не викине NullPointerException.
У java8 з’явився клас Optional. З його допомогою можна перевіряти посилання на null більш “елегантно”:
import java.util.Optional; public class NullPointerExample { static String a; public static void main(String[] args) { int aLength = Optional.ofNullable(a) .map(String::length) .orElse(0); System.out.println(aLength); } }
Помістивши змінну a в Optional.ofNullable(a), ми тим самим перекладаємо перевірку на null метод ofNullable. Він повертає stream, який ми при потребі можемо використовувати.
Як би добре не був написаний код, подібна помилка буде слідувати за Вами від проекту до проекту. Головне розуміти, що вона означає і вміти її знаходити. Добре, що в консолі вказується номер рядка, де вона відбувається:

Тепер Ви знаєте більше про NullPointerException в Java. Поділіться статтею зі своїми друзями, якщо вважаєте, що їм це теж буде корисно.
Залишити відповідь