null и NullPointerException

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

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

  • Сравнение с null: == null / != null.
  • NPE возникает при разыменовании: вызов метода, доступ к полю, обращение к длине массива.
Список тем

1. Подставьте null и проверку

id: 40480_nul_01_replace_null_literal_and_check

В коде используется ссылочная переменная типа String, которая может содержать значение или отсутствие значения. В этом случае важно правильно задать отсутствие значения и корректно проверить переменную в условии, чтобы избежать NullPointerException и вывести одно из двух сообщений. Заполните пропуски в объявлении переменной и в проверке так, чтобы программа компилировалась и вела себя ожидаемо при отсутствии значения.

Заполните пропуски
public class Task {
    public static void main(String[] args) {
        String text = input1S;

        if (text input2S input3S) {
            System.out.println("Строка не задана");
        } else {
            System.out.println("Длина: " + text.length());
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Защитное условие перед вызовом метода

id: 40480_nul_02_replace_guard_before_deref

В этом фрагменте кода на Java у ссылочной переменной может не быть объекта. Если в таком состоянии попытаться вызвать метод у переменной, программа завершится с NullPointerException. Дополните условие так, чтобы вызов метода выполнялся только при безопасном состоянии переменной, а иначе выводилось сообщение о том, что значения нет. Структуру кода менять нельзя — нужно заполнить только пропуски в проверке.

Заполните пропуски
public class Task {
    public static void main(String[] args) {
        String login = null;

        if (login input1S input2S) {
            System.out.println(login.input3S());
        } else {
            System.out.println("Логин не задан");
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Ошибка: условие приводит к NullPointerException

id: 40480_nul_03_error_wrong_null_condition

В этом фрагменте Java-кода допущена логическая ошибка в условии: из-за неверного сравнения переменная может оказаться равной отсутствию объекта, но программа всё равно попадает в ветку if и пытается вызвать метод у ссылки. В результате при выполнении возникает NullPointerException. Исправьте одну локальную ошибку в строке с условием (только оператор сравнения), чтобы метод вызывался только когда ссылка указывает на объект.

Найдите ошибку и исправьте
public class Task {
    public static void main(String[] args) {
        String message = null;
        if (message == null) {
            System.out.println(message.toLowerCase());
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Ошибка: equals вызывается на null-ссылке

id: 40480_nul_04_error_equals_on_null

В этом фрагменте Java-кода сравниваются строки, но сравнение написано так, что при отсутствии значения в переменной может возникнуть NullPointerException. Нужно исправить одну локальную ошибку в строке с условием: сделать сравнение безопасным для случая, когда переменная равна отсутствию объекта. Новые строки добавлять нельзя — исправляется только проблемный фрагмент сравнения.

Найдите ошибку и исправьте
public class Task {
    public static void main(String[] args) {
        String role = null;
        if (role.equals("ADMIN")) {
            System.out.println("Access granted");
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Соберите null-безопасный сценарий

id: 40480_nul_05_build_from_parts_null_safe_flow

Из перемешанных строк соберите корректную Java-программу, которая демонстрирует null-безопасный сценарий: создаётся ссылочная переменная, ей присваивается отсутствие значения, затем выполняется проверка на null, и только в безопасной ветке происходит вызов метода у строки. Одна строка лишняя — она нарушает логику null-безопасности и не должна попадать в итоговую последовательность.

Перетяните в правильном порядке строки из одного блока в другой
public class Task {
    public static void main(String[] args) {
        String name = null;
        if (name != null) {
            System.out.println(name.toUpperCase());
        } else {
            System.out.println("name is null");
        }
    }
}
        System.out.println(name.length());
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Введите результат сравнения с null

id: 40480_nul_06_give_result_null_comparison

Рассмотрите фрагмент Java-кода, в котором ссылочная переменная сравнивается со значением null, а результат этого сравнения выводится в консоль. Вам нужно мысленно выполнить программу, не изменяя код, и определить, что именно будет напечатано: true или false. Введите в поле ответа только одно логическое значение (true или false) без кавычек и лишних пробелов.

Что должно получиться?
public class Main {
    public static void main(String[] args) {
        String name = null;
        boolean isNull = name == null;
        System.out.println(isNull);
    }
}
Сообщения
Проверить
Показать подсказку

7. Где может возникнуть NullPointerException?

id: 40480_nul_07_click_target_where_npe_possible

Перед вами фрагмент Java-кода, в котором несколько переменных могут содержать значение null. Ваша задача — внимательно проанализировать код и выделить кликом все места, где происходит разыменование ссылочной переменной (обращение к методу или полю через точку), которое при значении null приведёт к NullPointerException. Не выделяйте безопасные обращения, сравнения с null или присваивания.

Кликните по всем фрагментам, которые подходят под условие задания.
String name = null;
String title = "Report";
List<String> items = null;

if ({{name != null~|~t1}}) {
    System.out.println({{name.toUpperCase()~|~t2}});
} else {
    System.out.println("Name is missing");
}

System.out.println({{title.length()~|~t3}});

if ({{items != null~|~t4}}) {
    System.out.println({{items.size()~|~t5}});
}

// Опасные места без проверки:
{{name.length()~|~t6}};
{{items.get(0)~|~t7}};
{{title.toLowerCase()~|~t8}};

Сообщения
Проверить
Показать подсказку

8. Разметьте: null, ссылка и разыменование

id: 40480_nul_08_highlight_parts_null_and_deref

Разметьте выделенные фрагменты кода Java: укажите, где используется литерал «null», где показаны имена ссылочных переменных и где происходит разыменование — обращение к полю или методу по ссылке. Это задание помогает увидеть, в каком месте программы может возникнуть NullPointerException при попытке вызвать метод у отсутствующего объекта.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
String {{userName~|~t1}} = {{null~|~t2}};
System.out.println({{userName.length()~|~t3}});
{{userName~|~t4}} = "Alex";
System.out.println({{userName.length()~|~t5}});
Разыменование (доступ к полю/методу)
Ссылочная переменная
Литерал null
Сообщения
Проверить
Показать подсказку

9. Сопоставьте ситуацию и результат

id: 40480_nul_09_compare_cases_and_outcome

В левой колонке находятся фрагменты Java-кода с различными ситуациями, связанными с использованием значения null: присваивание, сравнение и вызов методов. В правой колонке даны краткие описания того, что произойдёт при выполнении каждой строки: булевый результат или возникновение NullPointerException. Сопоставьте каждый фрагмент кода слева с соответствующим описанием результата справа.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
String s = null;
String s = null; boolean result = (s == null);
String s = null; boolean result = s == "Java";
String s = null; boolean result = s.equals("Java");
String s = "Java"; boolean result = s.equals(null);
String s = null; int len = s.length();
Integer n = null; boolean result = (n == 0);
Вызов equals("Java") на ссылке, равной null, приводит к NullPointerException при обращении к методу.
Попытка вызвать метод length() у ссылки, равной null, приводит к выбрасыванию NullPointerException.
Переменной присвоено значение null, программа продолжает работу без исключения.
Сравнение Integer n = null с числом 0 через '==' вызывает автораспаковку и приводит к NullPointerException.
Сравнение ссылки с null с помощью '==' даёт результат true, исключение не возникает.
Сравнение null с ненулевой строкой через '==' даёт результат false без исключения.
Вызов equals(null) на строке "Java" выполняется без исключения и возвращает false.
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру