|
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
|
|
NPE и как с ним бороться, или то что делает код ужасным25.12.2018, 13:36. Показов 1107. Ответов 10
Добрый день, форумчане!
Столкнулся с такой проблемой. Сейчас я работаю с проектом связанным с телефонией, где приходиться активно работать с обьектами с огромным количеством параметром,которые в свою очередь связаны с базой данных, и являються сущностями Hibernate. Проблема у меня следующего характера: есть очень много ситуаций, где при работе с этими обьектами я сталкиваюсь с NPE, и ситуаций таких чрезвычайно много. Сейчас в каждой такой ситуации мне приходиться либо делать проверку на нуль, либо же , где проверка не применима, заключать эти участки в try-catch блоки. Сразу же оговорюсь, ситуации в которых я могу получить нуль трудно предсказуемы т.к. зависят от того что вернёт сервер телефонии, что в свою очередь зависит от огромного количества факторов , которые учесть в некоторых ситуациях вообще не представляеться возможным. Так вот, все эти проверки и try-catch блоки делают код до безобразия отвратительным и совершенно нечитаемым, и это вообще не алё. На данном этапе я вижу только 2 решения данной проблемы: 1) Это каждый раз при создании обьекта (а создаю я его много где) инициализировать его какими-то значениями по умолчанию. Что мне не нравится: параметров реально огромное количество (20+ и я не могу их изменить т.к. такова специфика библиотеки которую я использую для телефонии) , а некоторые из них являються параметрами других обьектов которые тоже могут быть нуль. Получаються опять таки безобразные длинющие вызовы конструкторов, которые выглядеть не очень, дак + ещё нужно будет всем этим обьектам переприсваивать значения, что тоже кажеться лишней работой и как то не очень красиво; 2) Это создать метод, что то типа initObject() который будет, например, на вход принимать обьект любого типа , и там например создавать обьект этого типа с описанными в этом методе параметрами по умолчанию. Что мне не нравится: этот вариант лучше , но я ещё не до конца уверен, что такое можно реализовать (никогда такого не делал. Не опытный я ещё) , можно ли запихнуть в такой метод несколько конструкторов одного типа обьекта и как потом всё это вызывать , и вообще нормально ли это? Обращаюсь к Вам, уважаемые форумчане , что можно сделать в такой ситуации, в какую сторону двигаться , что почитать? Спасибо большое!
0
|
|
| 25.12.2018, 13:36 | |
|
Ответы с готовыми решениями:
10
Что за егог и как с ним бороться? Вирус zivlingamer или оно же gameplayinfo и как с ним бороться Что делает PlaySound, и как с ним вообще работать |
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|||
| 25.12.2018, 13:48 | |||
|
1
|
|||
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 25.12.2018, 15:27 | |
|
Optional ?
1
|
|
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
|
|||
| 25.12.2018, 18:31 | |||
|
И примеры их использования с этими проверками.
1
|
|||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
| 25.12.2018, 19:08 | |
|
GracefulLeo, вопрос тут не как лучше написать код, а что будет делать твоя программа если она не получила нужного ей поля. Если поле не обязательно, нафига оно тогда тебе? А если обязательно, тогда это хорошо что программа отваливается если такого поля нет.
В общем случае можно создать свой класс с меньшим кол-вом полей которые реально нужны и маппить их (автоматически с использованием ModelMapper). На этих полях своего класса ты можешь проставить аннотации @NotNull и валидировать их опять же не плодя лишний код.
2
|
|
|
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
|
||||||||||
| 26.12.2018, 06:03 | ||||||||||
|
Если поле может быть NULL, значит нужно делать проверку, вот и всё. Для облегчения поиска таких "уязвимых мест" есть много способов, про них можно почитать в куче различных статей. Например аннотация javax.annotation.Nullable, поставленная на геттер, который может вернуть NULL, даст подсветку в многих IDE (NetBeans, Idea точно), где используется этот геттер и без проверок возможен NPE. P.S. Если уж хочется избавиться от проверок, ну в геттере возвращай "значение по умолчанию", в случае, если поле NULL, аля:
1
|
||||||||||
|
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
|
||||||||||||||
| 27.12.2018, 01:07 [ТС] | ||||||||||||||
|
https://docs.oracle.com/javase... ional.html
Всем спасибо за комментарии, есть над чем помозговать и поработать)
0
|
||||||||||||||
|
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
|
|
| 27.12.2018, 02:02 | |
|
Да, 22 параметра в конструкторе да и полей многовато))) Видимо изначально ни как не проектировалось, и получился не "объект класса" а "база данных класса/объекта", только данные без какой либо логики, сущность хранения и передачи данных дальше.
Я бы разбил класс на супер класс с заполнеными полями-таблицы(данные которые обязательно есть) и конструктором по умолчанию. И на подклассы такого содержания какие конструкторы у вас есть (можно даже 2-е, 3-е наследование), ну и ясное дело добавлял те поля, которые появляются в конструкторах. Ну и в конце в ваш самый "нижний" класс добавил все остальное. Плюсы : даже самый последний по иерархии будет лучше выглядить чем то что сейчас, + когда надо используется нужная сущность а не весь "паравоз".
2
|
|
|
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
|
||
| 27.12.2018, 10:56 [ТС] | ||
0
|
||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
||
| 27.12.2018, 11:28 | ||
|
А вообще если это реальный проект, то судьба его будет печальна т.к на проекте должен быть хотя бы один человек уровнем выше джуниора чтобы направлять работу в нужное русло.
3
|
||
|
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 11
|
|||
| 27.12.2018, 13:07 [ТС] | |||
|
Вообще над этим проектом работает один человек. На самом деле, да, целиком и полностью согласен по поводу направление работы в нужное русло, однако проект реально небольшой, и многого от него не требуется, и скорее всего после рефакторинга , я к нему уже возвращаться не буду. Единственное его назначение, это быть рабочим модулем телефонии, который справляеться с текущей и последующими(возрастающими) нагрузками на должном уровне не сильно заламывая при этом требования к серваку. Предыдущей проект был написан С++ (его я кстати тоже поддерживаю, так как до сих пор некоторые наши офисы работают на старом сервере, и в связи с теме что они работают с очень важными клиентами, то никто не хочет там ничего менять, так как старые версии астериска, операционной системы (какая то древняя убунта) дак плюс к тому ещё и с тех пор как был написан тот проект вышел новый стандарт по с++ - 11-ый , и там вообще всё достаточно прискорбно). При этом моё приложение умудряеться работать быстрее и отказоустойчивее , в виду того что тот проект был написан в своё время таким же джуном (правда на плюсах) как я и архитектура там не намного лучше (если не сказать хуже). Больше заказчику от меня ничего не нужно =)
0
|
|||
| 27.12.2018, 13:07 | |
|
Помогаю со студенческими работами здесь
11
Плагиат. как с ним бороться? Тег br и как с ним бороться pagecontrol (и как с ним бороться) DBGrid, как с ним бороться? s.ytimg.com как с ним бороться? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|