← Назад к вопросам

Как написать код, который вызовет NullPointerException?

1.7 Middle🔥 132 комментариев
#Java

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы вызвать NullPointerException в Java

NullPointerException (NPE) - это одно из самых распространённых исключений времени выполнения в Java, которое возникает при попытке использовать null там, где требуется объект. Вот несколько способов вызвать его.

1. Вызов метода у null-ссылки

Самый классический случай - попытка вызвать метод у объекта, который равен null.

public class NpeExample {
    public static void main(String[] args) {
        String text = null;
        // Попытка вызвать метод length() у null-ссылки
        int length = text.length(); // NullPointerException здесь
    }
}

2. Доступ к полю null-объекта

Попытка получить или установить значение поля у null-объекта.

class Person {
    String name;
}

public class NpeExample2 {
    public static void main(String[] args) {
        Person person = null;
        // Попытка доступа к полю name у null-объекта
        String name = person.name; // NullPointerException здесь
    }
}

3. Индексация null-массива

Работа с массивом, который инициализирован как null.

public class NpeExample3 {
    public static void main(String[] args) {
        int[] numbers = null;
        // Попытка получить элемент null-массива
        int first = numbers[0]; // NullPointerException здесь
    }
}

4. Синхронизация по null-объекту

Использование null в качестве монитора для синхронизации.

public class NpeExample4 {
    public static void main(String[] args) {
        Object lock = null;
        // Синхронизация по null-объекту
        synchronized(lock) { // NullPointerException здесь
            System.out.println("Этот код не выполнится");
        }
    }
}

5. Автораспаковка null-обертки

Попытка распаковать null значение оберточного типа.

public class NpeExample5 {
    public static void main(String[] args) {
        Integer number = null;
        // Автораспаковка null Integer в int
        int value = number; // NullPointerException здесь
    }
}

6. Вызов метода через цепочку вызовов

Когда в цепочке вызовов один из элементов возвращает null.

class Address {
    String street;
}

class User {
    Address address;
}

public class NpeExample6 {
    public static void main(String[] args) {
        User user = new User();
        user.address = null;
        // Цепочка вызовов, где address = null
        String street = user.address.street; // NullPointerException здесь
    }
}

7. Использование null в switch (до Java 7)

В старых версиях Java использование null в операторе switch.

public class NpeExample7 {
    public static void main(String[] args) {
        String value = null;
        // switch по null строке (до Java 7)
        switch(value) { // NullPointerException здесь в Java 6 и ранее
            case "test":
                System.out.println("test");
                break;
        }
    }
}

8. Методы, специально выбрасывающие NPE

Некоторые методы стандартной библиотеки явно проверяют аргументы на null.

import java.util.Objects;

public class NpeExample8 {
    public static void main(String[] args) {
        String str = null;
        // requireNonNull явно выбрасывает NPE если аргумент null
        Objects.requireNonNull(str, "Аргумент не может быть null"); // NullPointerException здесь
    }
}

Практические рекомендации по предотвращению NPE

  • Используйте Objects.requireNonNull() для валидации аргументов методов
  • Применяйте Optional для явного указания на возможное отсутствие значения
  • Используйте аннотации @Nullable и @NotNull (из библиотек вроде JetBrains или JSpecify)
  • Выполняйте проверки в цепочках вызовов: if (obj != null && obj.getField() != null)
  • Используйте методы Map.getOrDefault() и аналогичные безопасные методы
  • В Java 14+ используйте улучшенное сообщение об ошибке NPE, включив флаг -XX:+ShowCodeDetailsInExceptionMessages
// Пример безопасного кода с Optional
import java.util.Optional;

public class SafeExample {
    public static void main(String[] args) {
        String possibleNull = getPossibleNull();
        
        // Безопасная обработка с Optional
        Optional.ofNullable(possibleNull)
                .ifPresentOrElse(
                    value -> System.out.println("Длина: " + value.length()),
                    () -> System.out.println("Значение отсутствует")
                );
    }
    
    private static String getPossibleNull() {
        return Math.random() > 0.5 ? "text" : null;
    }
}

Понимание причин возникновения NullPointerException важно не только для искусственного создания исключений, но и для написания стабильного, надежного кода, устойчивого к подобным ошибкам.

Как написать код, который вызовет NullPointerException? | PrepBro