Глиф Учебники

NullPointerException — причины и как исправить

Справочник · Java · 2 минуты чтения

NullPointerException (NPE) возникает, когда программа обращается к объекту через переменную, в которой лежит null — «ничего, ни один объект». Вызвать метод или прочитать поле у «ничего» нельзя, и программа останавливается.

Java
public class Main {
    static String name;

    public static void main(String[] args) {
        System.out.println(name.length());
    }
}

Поле name не получило значения, поэтому в нём null. Сообщение будет примерно таким:

Текст
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "Main.name" is null
    at Main.main(Main.java:5)

С Java 15 сообщение подсказывает, что именно было null и какой метод пытались вызвать. Строка at Main.main (Main.java:5) — место ошибки: файл Main.java, строка 5. Найдите её и выясните, почему переменная пуста.

Частые причины

Как защититься

Проверьте перед использованием:

Java
if (name != null) {
    System.out.println(name.length());
}

При сравнении строк ставьте известную строку слева — так null в переменной не вызовет ошибку:

Java
if ("да".equals(answer)) {
    System.out.println("Согласие получено");
}

answer.equals("да") при answer == null упадёт, а "да".equals(answer) просто вернёт false. Если оба значения могут быть null, используйте Objects.equals(a, b) из java.util.

Если значение обязано быть, проверьте его сразу на входе — так ошибка случится там, где её причина, а не позже:

Java
this.name = Objects.requireNonNull(name, "name не может быть null");

Подводные камни