NullPointerException — причины и как исправить
NullPointerException (NPE) возникает, когда программа обращается к объекту через переменную, в которой лежит null — «ничего, ни один объект». Вызвать метод или прочитать поле у «ничего» нельзя, и программа останавливается.
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. Найдите её и выясните, почему переменная пуста.
Частые причины
- Поле объекта не задано. Поля-объекты по умолчанию
null:String name;,int[] data;,Scanner in;. Присвойте значение в объявлении или в конструкторе. - Массив объектов только что создан.
new String[3]— это триnull, а не три пустые строки. Заполните элементы, прежде чем вызывать у них методы. - Метод вернул
null. Например,map.get(key)уHashMapвозвращаетnull, если ключа нет. Проверяйте результат или беритеgetOrDefault. - Число из
null.Integer x = map.get("нет"); int y = x;— при переводеIntegerвintтоже будет NPE. - Забыли
thisв конструкторе.name = name;присваивает параметр самому себе, а поле остаётсяnull.
Как защититься
Проверьте перед использованием:
if (name != null) {
System.out.println(name.length());
}При сравнении строк ставьте известную строку слева — так null в переменной не вызовет ошибку:
if ("да".equals(answer)) {
System.out.println("Согласие получено");
}answer.equals("да") при answer == null упадёт, а "да".equals(answer) просто вернёт false. Если оба значения могут быть null, используйте Objects.equals(a, b) из java.util.
Если значение обязано быть, проверьте его сразу на входе — так ошибка случится там, где её причина, а не позже:
this.name = Objects.requireNonNull(name, "name не может быть null");Подводные камни
- Не «лечите» NPE пустым
try { … } catch (NullPointerException e) { }— ошибка спрячется, а неверные данные пойдут дальше. Ищите, откуда взялсяnull. nullи пустая строка""— разные вещи: у пустой строкиlength()работает и возвращает 0.- В IntelliJ IDEA жёлтая подсветка с предупреждением о возможном
nullчасто показывает NPE ещё до запуска.