Как да се справя с 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.

Lombok Null Check

Сега вземете следния пример:

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проверката Lombok :

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.