На прошлой неделе у нас был горячий спор об обработке нулей в слое обслуживания нашего приложения. Вопрос в контексте .NET, но он будет таким же в Java и многих других технологиях.
Вопрос заключался в следующем: следует ли вам всегда проверять наличие нулевых значений и заставлять ваш код работать, несмотря ни на что, или позволить исключению всплыть при неожиданном получении нулевого значения?
С одной стороны, проверка на null там, где вы этого не ожидаете (т. Е. У вас нет пользовательского интерфейса для обработки), на мой взгляд, такая же, как написание блока try с пустым catch. Вы просто скрываете ошибку. Ошибка может заключаться в том, что что-то изменилось в коде, и теперь null является ожидаемым значением, или произошла какая-то другая ошибка, и в метод передан неправильный идентификатор.
С другой стороны, проверка на нули может быть хорошей привычкой в целом. Кроме того, если есть проверка, приложение может продолжать работать, только небольшая часть функциональности не оказывает никакого влияния. Затем клиент может сообщить о небольшой ошибке, такой как «невозможно удалить комментарий» вместо гораздо более серьезной ошибки, такой как «невозможно открыть страницу X».
Какую практику вы придерживаетесь и каковы ваши аргументы за или против любого подхода?
Обновить:
Я хочу добавить некоторые подробности о нашем конкретном случае. Мы извлекали некоторые объекты из базы данных и обрабатывали их (скажем, создавали коллекцию). Разработчик, который написал код, не ожидал, что объект может быть нулевым, поэтому он не включил никаких проверок, и при загрузке страницы произошла ошибка, и вся страница не загрузилась.
Очевидно, в этом случае должна была быть проверка. Затем мы вступили в спор о том, следует ли проверять каждый обрабатываемый объект, даже если ожидается, что он не будет отсутствовать, и следует ли окончательную обработку прервать молча.
Гипотетическим преимуществом будет то, что страница будет продолжать работать. Подумайте о результатах поиска на Stack Exchange в разных группах (пользователи, комментарии, вопросы). Метод может проверять наличие нуля и прерывать обработку пользователей (которая из-за ошибки равна нулю), но возвращает разделы «комментарии» и «вопросы». Страница продолжит работать, за исключением того, что раздел «пользователи» будет отсутствовать (что является ошибкой). Должны ли мы рано провалиться и сломать всю страницу или продолжить работу и ждать, пока кто-нибудь заметит, что раздел «пользователи» отсутствует?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");