Вопрос проверяет знание подходов к обработке null-значений, что важно для написания безопасного и читаемого кода, избегающего ошибок NullPointerException.
Обработка null-значений — частая задача, и прямые проверки if-else могут загромождать код. Рассмотрим основные альтернативы.
Класс Optional из Java 8 инкапсулирует значение, которое может быть null. Он предоставляет методы для безопасной обработки.
Optional maybeName = Optional.ofNullable(getName());
String result = maybeName
.map(String::toUpperCase)
.orElse("DEFAULT");
// Если getName() вернёт null, result будет "DEFAULT"Это устраняет необходимость явных проверок и позволяет строить цепочки преобразований.
Во многих языках есть специальный оператор, возвращающий левый операнд, если он не null, иначе правый.
// C#
string name = potentialName ?? "Unknown";
// JavaScript/TypeScript
const value = input ?? defaultValue;Это компактная замена простого if-else для присвоения значения по умолчанию.
Это техника, при которой проверки на невалидные значения (включая null) выполняются в начале функции, и в случае ошибки происходит ранний выход.
public void process(User user) {
if (user == null) {
throw new IllegalArgumentException("User cannot be null");
// или return;
}
// Основная логика, теперь user гарантированно не null
}Это делает код плоским и ясным, избавляя от глубокой вложенности.
Подходит для простых случаев выбора между двумя значениями.
String status = (value != null) ? value : "pending";Создаётся специальный объект, представляющий "отсутствие значения", но с нейтральным поведением, что позволяет избежать проверок.
// Вместо возврата null возвращается пустая реализация интерфейса
public interface Listener {
void onEvent();
}
class NullListener implements Listener {
public void onEvent() { /* ничего не делать */ }
}Вывод: Используйте Optional для потоковой обработки возможных null-значений в Java, оператор ?? для краткого задания значений по умолчанию в JS/C#, а guard clauses — для упрощения логики методов и повышения читаемости.