NullPointerException: что это такое и как исправить

NullPointerException – самая распространенная ошибка Java. В этой статье мы попытаемся понять почему она возникает и как ее избегать.

Ошибки при программировании неизбежны. Для хорошего разработчика очень важно уметь находить и вовремя их исправлять.

NullPointerException возникает, когда объект не инициализирован и при этом с ним пытаются проводить определенные операции. Если попытаться перевести фразу null pointer exception, то выйдет исключение нулевого указателя:

перевод фразы null pointer exception
перевод фразы null pointer exception

Давайте вернемся немного к теории классов в языке Java. Ведь нам известно, что класс это и есть объект. Чтобы создать новый объект, нам нужно:

  • обозначить его тип, имя,
  • написать ключевое слово new,
  • вызвать конструктор класса.

В некоторых случаях можно не писать new. Например когда мы работаем со строками, можно написать просто String a = “Hi there”;

По сути после знака равно (=) мы фактически присваиваем значение нашему объекту. В языке Java есть ключевое слово null. Первоначально оно было создано для обозначения отсутствия объекта. Используя данное ключевое слово, мы можем “частично” создать объект. Например, когда пока не знаем какое будет его значение:

String a = null;

Программа будет работать, но как только мы попытаемся что-то сделать с объектом, который указываем на null, мы сразу получим NullPointerException:

package com.javamaster.exceptions;

public class NullPointerExample {

	public static void main(String[] args) {
		String a = null;
		a.length();
	}

}

Увидев пример выше, можно задать резонный вопрос кто в здравом уме будет писать специально нулл чтобы поймать NullPointerException. Но ведь у Вас получилось это сделать?) Иначе на эту статью Вы бы не попали.

Не все так однозначно и не спешите упрекать себя и искать в коде явное написание null.

NullPointerException может возникать даже тогда, когда Вы явно ничего такого не прописывали в коде. Но она возникает всегда из-за указателя на null.

Теперь самое время вспомнить как в Java происходит инициализация переменных разных типов. Описал я это еще в статье Классы, методы и конструкторы в Java. Для полей класса инициализация происходит “по умолчанию”. И для объектов переменные инициализируются null значением. Вот почему у нас зачастую возникает NullPointerException даже, когда мы явно ничего не прописывали в коде.

Кстати, создатель понятия null, Тони Хоар на одной из конференций извинился за свое изобретение. И сказал, что это “Ошибка на миллиард долларов”.

Если в методе и нужно явно прописывать значение переменной. Иначе компилятор просто не запустит программу. Тогда в классе прописывать значение явно необязательно. Оно будет создано по умолчанию:

И если примитивные типы данных по умолчанию инициализируются значениями, то объекты получают null.

При попытке вызвать любой метод или поле таких объектом, мы получим NullPointerException.

Теперь, когда мы знаем о причинах возникновения вышеописанной ошибки, можно начинать искать способы ее избежания.

Самый простой, очевидный и единственный способ – это проверка объекта на null перед тем как выполнять над ним операции:

package com.javamaster.exceptions;

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 более “элегантно”:

package com.javamaster.exceptions;

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. Поделитесь статьей со своими друзьями если считаете что им это тоже будет полезно.

Еще можете посетить наш телеграм канал, где я публикую анонсы статей и видео, а также небольшие заметки по IT, которые не попадают на сайт: https://t.me/java_master.

Leave a Comment

Your email address will not be published.