Вопрос проверяет понимание принципов обработки ошибок и проектирования API, помогая выбрать между возвратом пустого значения и генерацией исключения.
Выбор между возвратом пустого результата и генерацией исключения — это ключевое решение при проектировании надежных и понятных интерфейсов. Основная цель — четко сообщить вызывающему коду о результате операции: успех, ожидаемое отсутствие данных или ошибка.
Пустой результат (null, пустая коллекция, специальный объект вроде Optional.empty) сигнализирует, что операция завершилась штатно, но искомые данные отсутствуют. Это часть нормального потока выполнения программы.
Исключение следует использовать для сигнализации об исключительных (ошибочных) ситуациях, которые нарушают обычный поток выполнения или контракт метода.
public class UserRepository {
// Возврат Optional — ясная семантика: пользователь может отсутствовать.
public Optional findUserById(Long id) {
// ... выполнение запроса к БД
if (userFound) {
return Optional.of(user);
} else {
return Optional.empty(); // Ожидаемый случай: нет пользователя.
}
}
// Выброс исключения при нарушении контракта или сбое системы.
public User getUserById(Long id) throws DatabaseException {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
try {
// ... выполнение запроса к БД
if (userFound) {
return user;
} else {
throw new EntityNotFoundException("User with id " + id + " not found");
}
} catch (SQLException e) {
// Непредвиденная ошибка инфраструктуры.
throw new DatabaseException("Failed to fetch user", e);
}
}
}Вывод: Используйте возврат пустого результата для ожидаемых "отсутствующих" состояний в рамках бизнес-логики. Применяйте исключения для обработки реальных ошибок, сбоев и нарушений предварительных условий, которые требуют отдельного внимания или аварийного завершения операции.