Обработка null в цикле for в Java: проверки и альтернативы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
for (YourType item : yourCollection) {
    if (item != null) {
        // Обрабатываем только корректные ненулевые элементы
    }
}

В процессе итерации мы проверяем элемент item на null. Это помогает избежать NullPointerException и продолжить выполнение цикла без препятствий. Но прежде всего следует удостовериться, что сама коллекция yourCollection не является null. Эту проверку выполним перед началом цикла для своей безопасности.

Кинга Идем в IT: пошаговый план для смены профессии

Готовимся к бою: Проверка на null перед циклом

Для предотвращения ошибок по ходу выполнения, коллекцию следует проверить на null до начала цикла.

Java
Скопировать код
if (yourCollection == null) {
    // Коллекция не должна быть null! Выбрасываем IllegalArgumentException
    throw new IllegalArgumentException("Коллекция не инициализирована, подобное недопустимо!");
}
// Теперь мы можем безопасно перебирать элементы коллекции, исключив риск NullPointerException
for (YourType item : yourCollection) {
    // Запускаем обработку элементов
}

Или можно воспользоваться Optional для создания более изящного решения:

Java
Скопировать код
yourCollection = Optional.ofNullable(yourCollection).orElse(Collections.emptyList());

// Теперь всё готово для безупречного выполнения цикла
for (YourType item : yourCollection) {
    // Запускаем обработку элементов
}

В поддержку полезных методов: Профессиональное применение проверок на null

Избегайте повторений и используйте вспомогательные методы для улучшения своего кода:

Java
Скопировать код
public static <T> Iterable<T> safetyFirst(Iterable<T> iterable) {
    // Если iterable равно null, возвращаем безопасный пустой итератор. В противном случае возвращаем iterable без изменений.
    return iterable == null ? Collections::emptyIterator : iterable;
}

// Используем вспомогательный метод, и теперь можем итерировать без беспокойства о null
for (YourType item : safetyFirst(yourCollection)) {
    // Принимаемся за обработку каждого элемента
}

Если вы предпочитаете использовать сторонние библиотеки, Apache Commons Collections предлагает метод ListUtils.emptyIfNull:

Java
Скопировать код
for (YourType item : ListUtils.emptyIfNull(yourCollection)) {
    // Занимаемся обработкой элементов
}

Внимание к деталям: Прекращение выполнения при обнаружении null

Если null означает наличие ошибки, лучше незамедлительно прекратить выполнение.

Java
Скопировать код
if (yourCollection == null) {
    // Пришла пора завершить работу, зарегистрировать ошибку либо обработать эту ситуацию иным образом
    return;
}
// После проверки на null можем безопасно провести итерацию
for (YourType item : yourCollection) {
    // Обработка элемента item
}

Советуем возвращать пустую коллекцию вместо null из ваших методов.

Держим руку на пульсе: Современные подходы к Java

С выходом новых версий Java, начиная с Java 8, появились удобные составы для работы со значениями, которые могут быть null.

Java
Скопировать код
yourCollection.stream()
              .filter(Objects::nonNull)
              .forEach(item -> {
                  // Обрабатываем каждый ненулевой элемент. Null-значения уже отфильтрованы. Спасибо, Java 8!
              });

Визуализация

Сравним нашу проверку на null в цикле for с жизненным примером:

Markdown
Скопировать код
Представим, что у нас есть дефектная сортировочная линия (🏭), которая отсеивает пакеты (📦). Если пакет дефектный, то есть равен null, он отсеивается. Вот как это работает:

Для каждого 📦 на 🏭:
    если 📦 исправен (не null):
        Обработка продолжается (🛠)
    в противном случае:
        Дефектный 📦 отбраковывается (🚫)

🛠 Улучшенный цикл for 🚫 Встроенная проверка на null

Мы обеспечили полную безопасность нашего процесса!

Поддерживаем чистоту и эффективность кода при помощи читаемости и проверок на null

Сделайте ваш код безупречным, как только что очищенный картофель, используя дотошные и внятные проверки на null внутри циклов.

Java
Скопировать код
Arrays.stream(yourArray)
      .filter(Objects::nonNull)
      .forEach(item -> {
          // Что такое 'null'? Не понимаем. Обработка каждого элемента исключает null.
      });

Интересный факт: Вы можете преобразовать массивы, возможно содержащие null, в безобидные пустые массивы и тем самым эффективно упорядочить итерацию. Для этого используйте ArrayUtils.nullToEmpty из Apache Commons Lang!

Легкость чтения: Консистентная обработка null

Для упрощения чтения и отладки разрабатывайте единый подход к обработке null в вашем коде. Можно использовать проверенные временем практики или создать свою собственную стратегию. Выбор за вами!

Полезные материалы

  1. Улучшенный цикл forОфициальное руководство Oracle по улучшенному циклу for.
  2. Как избегать проверки на null в Java?Обсуждение на Stack Overflow посвящено различным стратегиям проверки на null.
  3. Руководство по работе с классом Optional в JavaДетальное описание применения Optional для управления значениями, которые могут быть null.
  4. Как избегать проверок на null в JavaСтатья на портале DZone рассказывает о том, как писать код, не требующий проверок на null.
  5. Java: проверка объекта на nullУчебные материалы от DigitalOcean, посвященные различным подходам к проверке на null.
Свежие материалы