По моему мнению, есть разница между возвратом NULL, возвратом некоторого пустого результата (например, пустой строки или пустого списка) и выдачей исключения.
Я обычно придерживаюсь следующего подхода. Я рассматриваю вызов функции или метода f (v1, ..., vn) как применение функции
f : S x T1 x ... x Tn -> T
где S это «состояние мира» T1, ..., Tn - типы входных параметров, а T - тип возвращаемого значения.
Сначала я попытаюсь определить эту функцию. Если функция частичная (то есть есть некоторые входные значения, для которых она не определена), я возвращаю NULL, чтобы сигнализировать об этом. Это потому, что я хочу, чтобы вычисление завершалось нормально и сообщало мне, что функция, которую я запросил, не определена для заданных входных данных. Использование, например, пустой строки в качестве возвращаемого значения неоднозначно, поскольку может быть так, что функция определена на входах, а пустая строка является правильным результатом.
Я думаю, что дополнительная проверка для указателя NULL в вызывающем коде необходима, потому что вы применяете частичную функцию, и задача вызываемого метода - сообщить вам, если функция не определена для данного ввода.
Я предпочитаю использовать исключения для ошибок, которые не позволяют выполнять вычисления (т.е. не было возможности найти какой-либо ответ).
Например, предположим, что у меня есть класс Customer, и я хочу реализовать метод
Customer findCustomer(String customerCode)
искать клиента в базе данных приложения по его коду. В этом методе я бы
- Вернуть объект класса Customer, если запрос выполнен успешно,
- Вернуть ноль, если запрос не находит клиента.
- Бросьте исключение, если невозможно подключиться к базе данных.
Дополнительные проверки для нуля, например
Customer customer = findCustomer("...");
if (customer != null && customer.getOrders() > 0)
{
...
}
являются частью семантики того, что я делаю, и я бы не просто «пропустил их», чтобы код читался лучше. Я не думаю, что хорошей практикой является упрощение семантики рассматриваемой проблемы просто для упрощения кода.
Конечно, поскольку проверка на ноль происходит очень часто, хорошо, если язык поддерживает какой-то специальный синтаксис для нее.
Я также хотел бы рассмотреть возможность использования шаблона Null Object (как предложено Laf), пока я могу отличить нулевой объект класса от всех других объектов.