Як обробляти NullPointerException в Java

Якщо ви витратили якийсь час на розробку програм на Java, то в якийсь момент ви точно побачили наступний виняток:

java.lang.NullPointerException

Деякі основні виробничі проблеми виникають через NullPointerException. У цій статті ми розглянемо деякі способи обробки NullPointerExceptionв Java.

Проста нульова перевірка

Розглянемо наступний фрагмент коду:

public static void main(String args[]) { String input1 = null; simpleNullCheck(input1); } private static void simpleNullCheck(String str1) { System.out.println(str1.length()); }

Якщо запустити цей код як є, ви отримаєте такий виняток:

Exception in thread "main" java.lang.NullPointerException

Причиною цієї помилки є те, що ми намагаємось виконати length()операція, на str1якій є null.

Це просте виправлення - додати нульову перевірку str1як показано нижче:

private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }

Це забезпечить, що, коли str1єnull, ви не запускаєте length()функція на ньому.

Але у вас може виникнути наступне запитання.

Що робити, якщо str1 є важливою змінною?

У такому випадку ви можете спробувати щось подібне:

 private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } else { // Perform an alternate action when str1 is null // Print a message saying that this particular field is null and hence the program has to stop and cannot continue further. } }

Ідея полягає в тому, що, коли ви очікуєте, що значення має бути null, краще поставити nullперевірку на цю змінну. І якщо значення виявиться таким null, вживайте альтернативні дії.

Це стосується не лише рядків, але й будь-якого іншого об'єкта в Java.

Нульова перевірка Ломбока

Тепер візьмемо такий приклад:

public static void main(String args[]) { String input2 = "test"; List inputList = null; lombokNullCheck(input2, inputList, input2); } public static void lombokNullCheck(String str1, List strList, String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Тут ми маємо функцію , яка приймає три аргументи: str1, strListі str2.

Якщо якесь із цих значень виявляється таким null, ми взагалі не хочемо виконувати логіку в цій функції.

Як ви цього досягнете?

Тут Ломбок стане в нагоді. Для того, щоб додати бібліотеку Lombok у свій код, включіть таку залежність Maven:

  org.projectlombok lombok 1.18.12 provided 

Щоб дізнатись більше про Maven, перегляньте цю статтю.

Ось як би виглядав код із nullперевіркою Ломбока :

public static void main(String args[]) { String input2 = "test"; List inputList = null; try { lombokNullCheck(input2, inputList, input2); } catch (NullPointerException e) { System.out.println(e); } } public static void lombokNullCheck(@NonNull String str1, @NonNull List strList, @NonNull String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Перед кожним аргументом функції, яку ми додаємо @NonNullанотація.

Крім того, коли ми викликаємо цю функцію, ми ставимо try-catchблок навколо виклику функції, щоб зловити NullPointerException.

Якщо будь-який з аргументів, наведених у функції, виявиться таким null, функція видасть a NullPointerException. Потім це було б зафіксовано try-catchблоком.

Це гарантує, що якщо якийсь із аргументів функції виявиться таким null, то логіка у функції не виконується, і ми знаємо, що код не буде поводитися незвично.

Це можна зробити за допомогою купи nullперевірок. Але використання Lombok допомагає нам уникнути написання декількох nullоператорів перевірки та робить код набагато чистішим.

Списки та нулі

Скажімо, у вас є список і ви хочете надрукувати всі елементи у списку:

List stringList = new ArrayList(); stringList.add("ele1"); stringList.add("ele2"); if (stringList != null) { for (String element : stringList) System.out.println(element); }

Перш ніж перебирати список, нам потрібно поставити nullгалочку в списку.

Якщо nullперевірка відсутня, тоді спроба циклічного перегляду nullсписку викине a NullPointerException.

Карти та нулі

Візьмемо сценарій, коли вам потрібно отримати доступ до значення для певного ключа на карті:

Map testMap = new HashMap(); testMap.put("first_key", "first_val"); if (testMap != null && testMap.containsKey("first_key")) { System.out.println(testMap.get("first_key")); }

Спочатку нам потрібно зробити нульову перевірку самого об’єкта карти. Якщо цього не зроблено, а карта є null, тоді NullPointerExceptionкидається a . Це робиться за допомогоюtestMap!=null

Після цього перевірте, чи присутній певний ключ, перш ніж отримати до нього доступ. Ви можете перевірити наявність ключа за допомогою testMap.containsKey("first_key"). Якщо цього не зробити, а конкретний ключ відсутній, ви отримаєте значення як null.

Чи потрібно завжди додавати Null Check?

Якщо ви точно знаєте, що певної змінної ніколи не може бути null, тоді ви можете уникнути додавання nullперевірки. Це може застосовуватися в приватних функціях, де ви можете контролювати дані, що надходять у функцію.

Але якщо ви насправді не впевнені в недопустимості об’єкта, найкраще додати nullперевірку.

Код

Весь код, обговорений у цій статті, можна знайти в цьому репозиторії Github.

Вітаємо ?

Тепер ви знаєте, як працювати NullPointerExceptionз Java!

Про автора

Я люблю технології і стежу за досягненнями в цій галузі. Я також люблю допомагати іншим своїми знаннями техніки.

Не соромтеся читати більше моїх статей у моєму блозі, спілкуватися зі мною на LinkedIn або стежити за мною у Twitter.