Гость
Статьи
Проверка на null в …

Проверка на null в Java, NullPointerException - обрабатывать?

Проверка на null в Java, NullPointerException - обрабатывать или нет? Ситуация такая. Проект большой, писала не я. Часто возникают ошибки с NullPointerException. Конечно, некрасиво выглядит. Заказчик может увидеть. Иногда, можно понять по данным почему их нет. Иногда проблема неочевидна и надо потратить много времени, чтобы понять проблема в данных или нет. Иногда вообще не вижу проблемы. Что делать с этой задачей тогда? Не делать ее? Но других нет.
36 ответов
Последний — Перейти
#1
Вообще на пустое значение проверять необходимо, особенно, если это запросы.

Как в сфере явы я хз. На хабре есть статья про эту ошибку habr. com/ru/articles/221243/
Гость
#2
ой, а у вас ус отклеился :-))) в смысле когда пишешь противоречивые темы - не забывай ники менять :-) только что жеж на питоне и js писала :-)
Гость
#3
Обрабатывать, конечно, надо.
Но когда "проект большой, писала не я", исправлять самой может оказаться сложнее, чем сделать всё с нуля.
Короче, по ситуации.
JsЧетко
#4
Гость

Обрабатывать, конечно, надо.
Но когда "проект большой, писала не я", исправлять самой может оказаться сложнее, чем сделать всё с нуля.
Короче, по ситуации.

они везде стоят, мешают. Иногда, может, просто данные в базу закинуть.
JsЧетко
#5
Гость

Обрабатывать, конечно, надо.
Но когда "проект большой, писала не я", исправлять самой может оказаться сложнее, чем сделать всё с нуля.
Короче, по ситуации.

нас торопят, хотят быстрее. Плохое решение отдавать тоже не хочется
Гость
#6
JsЧетко

они везде стоят, мешают. Иногда, может, просто данные в базу закинуть.

Чего закинуть то? :-) поясни для слабых умов
Гость
#7
JsЧетко

нас торопят, хотят быстрее. Плохое решение отдавать тоже не хочется

это ты автор что ли? ник поменял? так поздно пить боржоми :-)
Правда
#8
В целом, ловить конкретно NullPointerException (NPE) через try-catch — это почти всегда антипаттерн и костыль. Вместо этого надо делать профилактику, чтобы его не возникало. На большом легаси-проекте это частый факап. Вот как это хэндлить: В первую очередь, надо чекать на null в начале методов для критичных параметров, используй Objects.requireNonNull() для явного факапа с понятным сообщением. Это сразу проясняет, откуда ноги растут. Заюзай аннотации @Nullable и @NotNull, они как документирование, но для компилятора и IDE, помогают отловить проблемы на ранней стадии. Каждый раз, когда видишь метод, который может отдавать непонятно что, оборачивай его в Optional. Это заставит того, кто вызывает код, явно обработать кейс с отсутствующим значением, а не получать NPE в лоб. Если видишь место, где постоянно вылезает NPE, не пытайся перепилить весь проект, а делай точечные правки. Добавь проверку в этом конкретном методе и логируй контекст, чтобы понять, какие данные пришли и почему там null.
Гость
#9
Правда

В целом, ловить конкретно NullPointerException (NPE) через try-catch — это почти всегда антипаттерн и костыль. Вместо этого надо делать профилактику, чтобы его не возникало. На большом легаси-проекте это частый факап. Вот как это хэндлить: В первую очередь, надо чекать на null в начале методов для критичных параметров, используй Objects.requireNonNull() для явного факапа с понятным сообщением. Это сразу проясняет, откуда ноги растут. Заюзай аннотации @Nullable и @NotNull, они как документирование, но для компилятора и IDE, помогают отловить проблемы на ранней стадии. Каждый раз, когда видишь метод, который может отдавать непонятно что, оборачивай его в Optional. Это заставит того, кто вызывает код, явно обработать кейс с отсутствующим значением, а не получать NPE в лоб. Если видишь место, где постоянно вылезает NPE, не пытайся перепилить весь проект, а делай точечные правки. Добавь проверку в этом конкретном методе и логируй контекст, чтобы понять, какие данные пришли и почему там null.

Optional сразу нет, простите. Потом некрасивый код
Гость
#10
Гость

это ты автор что ли? ник поменял? так поздно пить боржоми :-)

архитектурно интересует. NullPointerException обычно возникает при доступе данных в обьекте, а обьект может быть пустой. Почему пустой обьект. Надоела Java, в JavaScript хоть оператор добавили, а так писать каждый раз
Гость
#11
Гость

Чего закинуть то? :-) поясни для слабых умов

данные. Получается их нет
Гость
#12
Гость

данные. Получается их нет

просто закинуть в базу данные, которых нет... ты чего сказать то хотел?
Гость
#13
Гость

архитектурно интересует. NullPointerException обычно возникает при доступе данных в обьекте, а обьект может быть пустой. Почему пустой обьект. Надоела Java, в JavaScript хоть оператор добавили, а так писать каждый раз

жуть.. пиши лучше как раньше - абстрактно, что работаешь в айти, получаешь миллионы.. а то когда пытаешься лезть в дебри - получается очень не очень. но зато почти нет подозрений, что ты нейронка. она бы так не написала
Гость
#14
Гость

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

гениально. Спрашивала у другого разработчика про NullPointerException, он говорил, что надо смотреть по коду и по ситуации. В итоге по каждому NullPointerException ходила и ситуации были разные.

А оказывается, можно где-нибудь просто в C++ запретить нулевые указатели и все и ошибок не будет.

Чистый код, данные проходят через всю программу!!!))))))
Гость
#15
Правда

В целом, ловить конкретно NullPointerException (NPE) через try-catch — это почти всегда антипаттерн и костыль. Вместо этого надо делать профилактику, чтобы его не возникало. На большом легаси-проекте это частый факап. Вот как это хэндлить: В первую очередь, надо чекать на null в начале методов для критичных параметров, используй Objects.requireNonNull() для явного факапа с понятным сообщением. Это сразу проясняет, откуда ноги растут. Заюзай аннотации @Nullable и @NotNull, они как документирование, но для компилятора и IDE, помогают отловить проблемы на ранней стадии. Каждый раз, когда видишь метод, который может отдавать непонятно что, оборачивай его в Optional. Это заставит того, кто вызывает код, явно обработать кейс с отсутствующим значением, а не получать NPE в лоб. Если видишь место, где постоянно вылезает NPE, не пытайся перепилить весь проект, а делай точечные правки. Добавь проверку в этом конкретном методе и логируй контекст, чтобы понять, какие данные пришли и почему там null.

а если в базе данных нет? будет доступ к нулевому указателю, не очень понимаю. Можно пример кода или ссылку
Гость
#16
Гость

гениально. Спрашивала у другого разработчика про NullPointerException, он говорил, что надо смотреть по коду и по ситуации. В итоге по каждому NullPointerException ходила и ситуации были разные.

А оказывается, можно где-нибудь просто в C++ запретить нулевые указатели и все и ошибок не будет.

Чистый код, данные проходят через всю программу!!!))))))

в каком С++ ? про java же вроде разговор шёл. что то ты совсем в показаниях путаешься.. ну признайся уже, что либо не имеешь к программированию никакого отношения, либо недавно прошла курсы, где тебя ничему не научили
Гость
#17
Гость

а если в базе данных нет? будет доступ к нулевому указателю, не очень понимаю. Можно пример кода или ссылку

ты о чём вообще? базы какие то приплела... может всё таки нейросеть? что то уже совсем смысл в писанине пропал... хотя нейросеть то его как раз внешне старается сохранять
Гость
#18
Гость

а если в базе данных нет? будет доступ к нулевому указателю, не очень понимаю. Можно пример кода или ссылку

от кого ты просишь пример кода или ссылку? это же у тебя вроде проблемы. нет?
Гость
#19
Гость

в каком С++ ? про java же вроде разговор шёл. что то ты совсем в показаниях путаешься.. ну признайся уже, что либо не имеешь к программированию никакого отношения, либо недавно прошла курсы, где тебя ничему не научили

под капотом у Java C++, можно замутить проверочку или скриптик, который исключает нулевые указатели - по сути это ячейка в памяти
Гость
#20
Гость

ты о чём вообще? базы какие то приплела... может всё таки нейросеть? что то уже совсем смысл в писанине пропал... хотя нейросеть то его как раз внешне старается сохранять

ну выходит ошибка order is null - значит, поле order пустое, а данные хранятся в базе, а код Java их обрабатывает. Я хочу вывести на экран order, и, там "Вы заказали товар null". То есть вот такую низкоуровневую архитектурную логику видит пользователь. Его голова нагружена вот этими техническими подробностями
Гость
#21
Гость

под капотом у Java C++, можно замутить проверочку или скриптик, который исключает нулевые указатели - по сути это ячейка в памяти

а под капотом у с++ ассемблер. ты не останавливайся на полпути! пиши сразу в машинных кодах! интересно - а язык у тебя хорошо подвешен? если реально захочешь устроиться программистом - сможешь красиво навешать лапши и удержаться от несения такого бреда, как тут?
Гость
#22
Гость

от кого ты просишь пример кода или ссылку? это же у тебя вроде проблемы. нет?

как во всем проекте отключить возникновение NullPointerException. Наверняка, есть какой-то способ, чтобы везде не писать.
Гость
#23
Гость

как во всем проекте отключить возникновение NullPointerException. Наверняка, есть какой-то способ, чтобы везде не писать.

хм... а ты вообще в курсе, что такое исключение и в чём их глубинный смысл? тут вопрос не в том, как отключить, а в том, чтобы рядом нашёлся человек, который будет бить по рукам за попытки это сделать
Гость
#24
Гость

ну выходит ошибка order is null - значит, поле order пустое, а данные хранятся в базе, а код Java их обрабатывает. Я хочу вывести на экран order, и, там "Вы заказали товар null". То есть вот такую низкоуровневую архитектурную логику видит пользователь. Его голова нагружена вот этими техническими подробностями

мда.... даже смысл ошибки ты не поняла... при чём тут NullPointerException?
Гость
#25
в общем автор - написала бы ты как с тобой связаться, сколько денег дадите за исправление косяков и не компостировала бы мозги странными вопросами :-)
Правда
#26
Гость

а если в базе данных нет? будет доступ к нулевому указателю, не очень понимаю. Можно пример кода или ссылку

Если в базе нет записи, ORM (например, Hibernate) или простой JDBC-запрос часто возвращают null. Доступ к этому null и вызовет NullPointerException (NPE).

Допустим,есть метод, который ищет пользователя по ID.
Проблемный код, который кинет NPE:

```java
public User getUserById(Long id) {
// Этот метод выполнит SQL-запрос типа "SELECT * FROM users WHERE id = ?"
// Если записи нет, он вернет null.
User user = userRepository.findById(id);

// Если пользователь не найден (user == null), следующая строчка упадет с NPE
String userName = user.getName(); //
Правда
#27
Правда

Если в базе нет записи, ORM (например, Hibernate) или простой JDBC-запрос часто возвращают null. Доступ к этому null и вызовет NullPointerException (NPE).

Допустим,есть метод, который ищет пользователя по ID.
Проблемный код, который кинет NPE:

```java
public User getUserById(Long id) {
// Этот метод выполнит SQL-запрос типа "SELECT * FROM users WHERE id = ?"
// Если записи нет, он вернет null.
User user = userRepository.findById(id);

// Если пользователь не найден (user == null), следующая строчка упадет с NPE
String userName = user.getName(); //

Продолжение
String userName = user.getName(); //
Правда
#28
Правда

Продолжение
String userName = user.getName(); //

Короче тут код не пишет, могу в лс отписать где-то в другом месте
Гость
#29
Правда

Короче тут код не пишет, могу в лс отписать где-то в другом месте

автор опять ник и циферки поменял? если перефразировать вопрос автора, то он выглядит как что то типа - доктор, у меня открытый перелом обеих ног. посоветуйте, какую одежду мне лучше носить, чтобы не было видно торчащих костей и я могла нормально ходить
Гость
#30
Правда

Если в базе нет записи, ORM (например, Hibernate) или простой JDBC-запрос часто возвращают null. Доступ к этому null и вызовет NullPointerException (NPE).

Допустим,есть метод, который ищет пользователя по ID.
Проблемный код, который кинет NPE:

```java
public User getUserById(Long id) {
// Этот метод выполнит SQL-запрос типа "SELECT * FROM users WHERE id = ?"
// Если записи нет, он вернет null.
User user = userRepository.findById(id);

// Если пользователь не найден (user == null), следующая строчка упадет с NPE
String userName = user.getName(); //

чего сказать то этим хотел?
Рерол
#31
Гость

чего сказать то этим хотел?

Если запись в базе не найдена, запрос вернет null. Обращение к этому null вызовет NPE. Решение — всегда проверять результат на null или использовать Optional.
Код не отправляется на этом сайте :(
Гость
#32
Рерол

Если запись в базе не найдена, запрос вернет null. Обращение к этому null вызовет NPE. Решение — всегда проверять результат на null или использовать Optional.
Код не отправляется на этом сайте :(

ну здорово. процитировал книжку. или какую то статью для начинающих. а какое это имеет отношение к ранее написанному про желание сделать мегахак, которых все такие исключения задавит на корню?
Рерол
#33
Гость

ну здорово. процитировал книжку. или какую то статью для начинающих. а какое это имеет отношение к ранее написанному про желание сделать мегахак, которых все такие исключения задавит на корню?

Ну здорово. Могу тебе прислать код, если ты срешь ничего не видя перед собой.

Глобальный try-catch на NullPointerException — это не мегахак, а костыль. Он маскирует проблему, а не решает её. Ошибка уйдёт из логов, но программа будет работать неправильно, и заказчик увидит ещё более странные баги.

Правильный путь — профилактика:
1. Чекать на null точечно в начале методов для критичных параметров через Objects.requireNonNull().
2. Использовать Optional из Spring Data JPA для явной обработки случаев, когда значения нет.
3. Ставить аннотации @Nullable, чтобы понимать, что может прийти null.

Не надо давить все исключения разом. Исправлять код в самых болезненных местах, откуда чаще всего приходят NPE. Это и есть работа.
Гость
#34
Рерол

Если запись в базе не найдена, запрос вернет null. Обращение к этому null вызовет NPE. Решение — всегда проверять результат на null или использовать Optional.
Код не отправляется на этом сайте :(

решение - смотреть по месту и разбираться. это единственное нормальное решение во всех случаях
Гость
#35
Рерол

Ну здорово. Могу тебе прислать код, если ты срешь ничего не видя перед собой.

Глобальный try-catch на NullPointerException — это не мегахак, а костыль. Он маскирует проблему, а не решает её. Ошибка уйдёт из логов, но программа будет работать неправильно, и заказчик увидит ещё более странные баги.

Правильный путь — профилактика:
1. Чекать на null точечно в начале методов для критичных параметров через Objects.requireNonNull().
2. Использовать Optional из Spring Data JPA для явной обработки случаев, когда значения нет.
3. Ставить аннотации @Nullable, чтобы понимать, что может прийти null.

Не надо давить все исключения разом. Исправлять код в самых болезненных местах, откуда чаще всего приходят NPE. Это и есть работа.

опять таки - ты это к чему? я не автор. меня ответы на её странные вопросы не интересуют. я пытаюсь понять - ты кому все эти цитаты копипастишь? и к чему?
Фунтик
#36
NPE можно обрабатывать, можно выкидывать Exception, можно скипать обработку, можно сделать ветвление через Optional.
Тебе принимать решение как поступить когда падает NPE. Точнее данный кейс уже видится что какая то кривота у тебя в коде. Если данные могут прийти с атрибутом = null можно на этапе валидации отказаться обрабатывать такую дто.
В общем смотреть нужно, но сам факт что у тебя падает NPE это уже плохой знак и показатель низкого твоего грейда.
Форум: Работа
Всего: 41 717 тем
Новые темы за сутки: 6 тем
Популярные темы за сутки: 2 темы