Обработка null в цикле for в Java: проверки и альтернативы
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
for (YourType item : yourCollection) {
if (item != null) {
// Обрабатываем только корректные ненулевые элементы
}
}
В процессе итерации мы проверяем элемент item
на null
. Это помогает избежать NullPointerException и продолжить выполнение цикла без препятствий. Но прежде всего следует удостовериться, что сама коллекция yourCollection не является null
. Эту проверку выполним перед началом цикла для своей безопасности.
Готовимся к бою: Проверка на null перед циклом
Для предотвращения ошибок по ходу выполнения, коллекцию следует проверить на null до начала цикла.
if (yourCollection == null) {
// Коллекция не должна быть null! Выбрасываем IllegalArgumentException
throw new IllegalArgumentException("Коллекция не инициализирована, подобное недопустимо!");
}
// Теперь мы можем безопасно перебирать элементы коллекции, исключив риск NullPointerException
for (YourType item : yourCollection) {
// Запускаем обработку элементов
}
Или можно воспользоваться Optional для создания более изящного решения:
yourCollection = Optional.ofNullable(yourCollection).orElse(Collections.emptyList());
// Теперь всё готово для безупречного выполнения цикла
for (YourType item : yourCollection) {
// Запускаем обработку элементов
}
В поддержку полезных методов: Профессиональное применение проверок на null
Избегайте повторений и используйте вспомогательные методы для улучшения своего кода:
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:
for (YourType item : ListUtils.emptyIfNull(yourCollection)) {
// Занимаемся обработкой элементов
}
Внимание к деталям: Прекращение выполнения при обнаружении null
Если null
означает наличие ошибки, лучше незамедлительно прекратить выполнение.
if (yourCollection == null) {
// Пришла пора завершить работу, зарегистрировать ошибку либо обработать эту ситуацию иным образом
return;
}
// После проверки на null можем безопасно провести итерацию
for (YourType item : yourCollection) {
// Обработка элемента item
}
Советуем возвращать пустую коллекцию вместо null из ваших методов.
Держим руку на пульсе: Современные подходы к Java
С выходом новых версий Java, начиная с Java 8, появились удобные составы для работы со значениями, которые могут быть null.
yourCollection.stream()
.filter(Objects::nonNull)
.forEach(item -> {
// Обрабатываем каждый ненулевой элемент. Null-значения уже отфильтрованы. Спасибо, Java 8!
});
Визуализация
Сравним нашу проверку на null в цикле for
с жизненным примером:
Представим, что у нас есть дефектная сортировочная линия (🏭), которая отсеивает пакеты (📦). Если пакет дефектный, то есть равен null, он отсеивается. Вот как это работает:
Для каждого 📦 на 🏭:
если 📦 исправен (не null):
Обработка продолжается (🛠)
в противном случае:
Дефектный 📦 отбраковывается (🚫)
🛠 Улучшенный цикл for 🚫 Встроенная проверка на null
Мы обеспечили полную безопасность нашего процесса!
Поддерживаем чистоту и эффективность кода при помощи читаемости и проверок на null
Сделайте ваш код безупречным, как только что очищенный картофель, используя дотошные и внятные проверки на null внутри циклов.
Arrays.stream(yourArray)
.filter(Objects::nonNull)
.forEach(item -> {
// Что такое 'null'? Не понимаем. Обработка каждого элемента исключает null.
});
Интересный факт: Вы можете преобразовать массивы, возможно содержащие null, в безобидные пустые массивы и тем самым эффективно упорядочить итерацию. Для этого используйте ArrayUtils.nullToEmpty из Apache Commons Lang!
Легкость чтения: Консистентная обработка null
Для упрощения чтения и отладки разрабатывайте единый подход к обработке null в вашем коде. Можно использовать проверенные временем практики или создать свою собственную стратегию. Выбор за вами!
Полезные материалы
- Улучшенный цикл for — Официальное руководство Oracle по улучшенному циклу for.
- Как избегать проверки на null в Java? — Обсуждение на Stack Overflow посвящено различным стратегиям проверки на null.
- Руководство по работе с классом Optional в Java — Детальное описание применения
Optional
для управления значениями, которые могут быть null. - Как избегать проверок на null в Java — Статья на портале DZone рассказывает о том, как писать код, не требующий проверок на null.
- Java: проверка объекта на null — Учебные материалы от DigitalOcean, посвященные различным подходам к проверке на null.