Как обрабатывать исключение 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проверкой 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, функция выдаст 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список вызовет ошибку 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выбрасывается. Это делается с помощьюtestMap!=null

Как только это будет сделано, проверьте, присутствует ли конкретный ключ, прежде чем обращаться к нему. Проверить наличие ключа можно с помощью testMap.containsKey("first_key"). Если этого не сделать и конкретный ключ отсутствует, вы получите значение как null.

Обязательно ли всегда добавлять нулевую проверку?

Если вы точно знаете, что конкретная переменная никогда не может быть null, то вы можете избежать добавления nullпроверки. Это может быть применимо в частных функциях, где вы можете контролировать данные, поступающие в функцию.

Но если вы не совсем уверены в допустимости значения NULL для объекта, лучше добавить nullпроверку.

Код

Весь код, обсуждаемый в этой статье, можно найти в этом репозитории Github.

Поздравляю ?

Теперь вы знаете, как работать NullPointerExceptionс Java!

Об авторе

Я люблю технологии и слежу за достижениями в этой области. Мне также нравится помогать другим своими техническими знаниями.

Не стесняйтесь читать больше моих статей в моем блоге, связываться со мной в LinkedIn или подписываться на меня в Twitter.