Возвращаемое значение null или значение по умолчанию обычно Неправильная практика и исключение должно быть предпочтительным. Причина в том, что вы всегда должны стремиться к сбою так быстро, как можете,, когда что-то пойдет не так. Если вы вернете null
- вы получите ошибки, происходящие в каком-то другом месте в коде, и пользователи вашего API будут иметь проблемы с обнаружением проблемы. Это называется Fail Fast
Исключением из этого правила является то, что ваш API заставит пользователей полагаться на исключения для управления потоком, поэтому, если ваш стек не поддерживает isEmpty()
, исключение здесь не очень хорошо.
Если у вас есть стек, который может позволить только peek()
, pop()
и add()
- по какой-то причине isEmpty()
не может быть частью API.
Что произойдет с кодом ваших пользователей для обоих подходов?
вариант 1 - с помощью нуля:
Integer x = stack.pop();
if (x != null) {
//do something with x
}
Вариант 2 - с использованием исключений:
Integer x = null;
try {
x = stack.pop();
} catch (MyException e) { }
//do something with x
Вторым фактически используют механизм исключений для управления потоком - который является большим недостатком в дизайне API ,
Я думаю, что это действительно зависит от того, чего вы хотите достичь. В любой ситуации спросите себя: Ожидается ли, что мой API возвращает значение по умолчанию? Должен ли пользователь моего API знать, что это значение по умолчанию? В большинстве случаев доступ или манипулирование данными/памятью должны бросать исключения, если что-то пошло не так. Но для понятий, которые вы создали, это зависит от вас. – Tonio
Хорошим примером этого является математика. Некоторое неопределенное поведение устанавливается по соглашению (например, 0 до 0-й степени равно 1 или 0! Равно 1), а некоторые не определены (например, деление на 0 или неопределенные формы для лимитов). Первая категория возвращает значения по умолчанию, в то время как последняя генерирует исключения. – Tonio