Почему нельзя возвращать NULL?

preview_player
Показать описание
Негативные последствия возвращения Null и как же работать правильно.

Курсы для новичков:

Продвинутые курсы для состоявшихся девелоперов:

0:00 – вступление Сергея Немчинского
00:27 – кто еще считает, что Null возвращать нельзя?
02:02 – почему нельзя возвращать NULL: обработка ошибок вручную
04:48 – почему нельзя возвращать NULL: неоднозначное понимание
06:16 – реклама
07:22 – почему нельзя возвращать NULL: нарушение мышления программиста, нагромождение кода
10:38 – почему нельзя возвращать NULL: медленный провал, затруднение поддержки системы
13:31 – история про индусов
15:13 – использование Null в изменяемых и незавершенных объектах
17:15 – как же тогда работать?
Рекомендации по теме
Комментарии
Автор

Всю пандемию возвращал null, теперь коллекторы названивают...

alexander_brun
Автор

- Микола, слыхав, як паскали наш null называють?
- Як?
- Nil! Поубивав би гадів!

ОлегЛитвиненко-оз
Автор

Когда пацики с района стреляют сигаретку, а ты, вместо ответа "не курю", падаешь и притворяешься мёртвым.
добавлено:
Забыл, ещё можно отдать им пустую пачку)

sergeimenshikov
Автор

Однажды русский программист из Калифорнийской компании вернул «zhopa», вместо Null. Всем понравилось, стали использовать. Потом стали нумеровать zhopa1, zhopa2, когда просто zhopa было недостаточно. Как-то звонят из Тайваня, говорят остановился весь завод, мы не понимаем из-за чего - даёт ошибку zhopa37 !

aa
Автор

Теперь буду вместо Null возвращать «Sergey Nemchinskiy»

aa
Автор

1) Тема Optional<T> не раскрыта :)
2) Еще можно было бы акцентировать внимание на том, что если есть метод, который может найти и вернуть *несколько* объектов, а может и ни одного (0..*), то в случае если не нашёл ничего, то обязательно нужно возвращать пустую коллекцию (или пустой массив), а не тупо null "для экономии памяти". А то видел я такое как-то. В результате вместо обычного итератора, который для 0 объектов просто сработал бы 0 раз, приходилось писать if+итератор.

P.S. 8:55 "... если каждый метод на входе будет проверять не null ли все его 20 параметров..." - явная проверка параметров *публичных* методов на null (а точнее не конкретно на null, а вообще на корректность) является хорошим тоном при разработке API: у публичного метода должна быть предусмотрена "защита от дурака".

BukasovMaxim
Автор

у каменщиков есть анекдот: кладет кладку смотрит кривовато, штукатуры заштукатурят, штукатуры - шпаклевщики зашпаклюют, шпаклевщики - поклейщики обоев что нибудь придумают, поклейщики - сносите всю стену нафиг.

Украина-йк
Автор

А если сериализуется JSON и у пользователя есть поле которое не установлено, значение его null

yegorsk
Автор

Логика нарушена. Почему, если возвращается null, то нужно переименовать метод в getStudentOrNull, а если выбрасывается эксепшон, то метод не нужно назвать getStudentOrThrowException?

TheSyntime
Автор

Ждём следующий выпуск - "почему нельзя возвращать -1".

legonn
Автор

Окей, но чем тогда отличается возвращение null от выбрасывания исключения в тех кейсах когда программа должна продолжить свою работу
Например аутентификация когда мы пытаемяся найти пользователя с определённым юзернеймом и от того, есть ли такой пользователь зависят дальнейшие действия, получается что вызывающий кот все равно должен обработать ситуацию только уже не с null, а с перехватлм исключения

ДенисБондарчук-йю
Автор

Спорный вопрос. Обкладывать все вызовы try-catch? Что ожидать? Какой крутизны должен быть стек catch-a
Или другое - ловиться в catch наверху и разруливать стектрейс?

Что мешает использовать ?? .? подводя к дефолту/nullObject если прям очень надо?

dvdrelin
Автор

Допустим, у класса User есть поле с типом Group которое может быть пустое. У Group поле title и другие.
Нам нужно вывести список юзеров с названиями их групп. Как быть без null? Возвращать вместо группы объект типа Group с пустым полем title? Это еще больше багов породит, причем намного хуже чем NPE, например в БД добавится пустая строка.
И как по сети передать, тому же фронту? Фронт получит какой-то объект с пустым title, ему это дикое условие проверять надо будет вместо простого == null.

drovoseg
Автор

Краткий итог всего видео: Рубисты молчать.

alexeylesnov
Автор

Так мило))))
А вообще супер объяснения, огромное спасибо за работу!

magadash
Автор

Сергей, добрый день. Полностью согласен с тем, что вы сказали в видео. Однако всегда интересовал вопрос: почему когда мы пытаемся в Hibernate достать из базы поле с несуществующим id, мы получаем просто null вместо exception? Или таким фреймворкам возвращать null можно?

levonminasian
Автор

Как будто мне не придётся проверять параметры на null, если в своих программах я перестану возвращать null. Есть же тысяча коллег, чьим кодом я пользуюсь.

Таши-бб
Автор

c++: постоянно использую возвращение nullptr в методах/функциях типа FindSomething(). Очень удобно. И когда это Something не найдено - это один из штатных вариантов, не требующий никаких эксэпшнов. В стандартных с++ контейнерах метод find возвращает какой-нить итератор end() в котором связанный указатель на Something равен nullptr. Какая тут принципиальная разница? Кроме того что без лишней конструкции в виде итератора - удобнее.

NullObject - это же по смыслу то же что и NULL, нам все равно для него нужно будет писать код отличный от случая с норм объектом типа if (NullObject != FindObject()) ... ручками в клиентском коде. И если такой NullObject заполненный дефолтными значениями попадет потом в какой-то список, чем это будет лучше попадания NULL? Уж лучше пусть прога упадет при обращении к нулевому указателю, чем не упадет и будет производить какие-то (рушащие логику) операции с дефолтными значениями NullObject, считая их правильными значениями полноценного Object.

baratorch
Автор

надеюсь следующее видео будет о том, почему нужно юзать котлин с null-safe и возвращать нулл

alexsokol
Автор

Вы посмотрите на API Java. Там огромное кол-во методов, которые выкидывают NULL, но это не особо волнует всех этих экспертов.

Тимур-еы