NullPointerException, одно из самых часто мелькающих исключений. Почему оно возникает?
Ссылочная переменная в Java - это как коробка. Коробка, у которой есть имя, и внутрь которой можно положить только определенный вид предмета объекта. Например:
Мораль - дарите девушкам телефоны, а переменным - значения. Так безопаснее:)
О том, как же все-таки работать с переменными, которым нельзя сразу присвоить конкретное значение и внутри могут быть null - ждите сказку в одном из будущих постов.
Ссылочная переменная в Java - это как коробка. Коробка, у которой есть имя, и внутрь которой можно положить только определенный вид предмета объекта. Например:
String box; //наша коробка переменная называется box и может хранить в себе строки (объекты типа String).В такой переменной может быть что-то записано, а может и ничего не быть - это самое ничего называется null. Если вы объявили переменную, но ничего в нее не записали - в ней по умолчанию будет значение null. Вот как это может выглядеть:
String box1 = "здесь могла бы быть твоя реклама"; //у переменной есть значениеnull сам по себе не вызовет проблем. Но если ты попробуешь обратиться к полю, или методу такой переменной - жди проблем исключений - NullPointerException.
String box2 = null; //мое значение null
String box3; //мое значение тоже null!
String box2 = null;Почему? Потому что внутри box2 - пустота, там нет реального объекта, у которого мы можем вызвать метод, или получить поле. И компилятор на это ругается. Ругается как девушка, которой на день рождения подарили коробку от айфона, внутри которой пустота.
System.out.println(box2.length());
//вызов метода length() приведет к выбросу NullPointerException
Мораль - дарите девушкам телефоны, а переменным - значения. Так безопаснее:)
О том, как же все-таки работать с переменными, которым нельзя сразу присвоить конкретное значение и внутри могут быть null - ждите сказку в одном из будущих постов.
👍4❤1
📗Фишка при работе со сьютами в TestNG
Если вам понадобилось сделать сьют в TestNG и выбрать только определенные тесты, и вы там набабахали себе групп, параметров, инклюдов-эксклюдов, а потом контрольно решили проверить - выбираются ли нужные тесты - то в обычном случае вам придется дождаться прогона всех этих тестов прежде чем узнать, правильно ли вы нахимичили свой suite. Но есть интересная фича для экономии времени - флаг -Dtestng.mode.dryrun=true
Если вы его передадите, например вот так:
то ни один тестовый метод не будет реально выполнен, но в surefire-репорте можно будет увидеть все вызывавшиеся методы, переданные через ваш сьют на запуск.
Если вам понадобилось сделать сьют в TestNG и выбрать только определенные тесты, и вы там набабахали себе групп, параметров, инклюдов-эксклюдов, а потом контрольно решили проверить - выбираются ли нужные тесты - то в обычном случае вам придется дождаться прогона всех этих тестов прежде чем узнать, правильно ли вы нахимичили свой suite. Но есть интересная фича для экономии времени - флаг -Dtestng.mode.dryrun=true
Если вы его передадите, например вот так:
mvn clean test -Dtestng.mode.dryrun=true
то ни один тестовый метод не будет реально выполнен, но в surefire-репорте можно будет увидеть все вызывавшиеся методы, переданные через ваш сьют на запуск.
👍4🔥2
Сложность: ⭐️🌚🌚🌚🌚 (1/5)
Время на чтение: 10 мин
Изучаешь Java? Шик!
Первый шаг - это установка Java в систему💻
Квест простой, но если ты запутался - рецепт по ссылке
Как говорил один ученый - "Вошли и вышли, приключение на 20 минут", но в нашем случае делов действительно на 20 минут, не больше.
Время на чтение: 10 мин
Изучаешь Java? Шик!
Первый шаг - это установка Java в систему💻
Квест простой, но если ты запутался - рецепт по ссылке
Как говорил один ученый - "Вошли и вышли, приключение на 20 минут", но в нашем случае делов действительно на 20 минут, не больше.
❤4👍3🤔1
Короткое видео с разбором как работает оператор инкремента в Java - тут:
https://youtu.be/RMNcbBkQM2A
3 минуты для зарядки мозгов!☕️
https://youtu.be/RMNcbBkQM2A
3 минуты для зарядки мозгов!☕️
YouTube
Пре-инкремент и пост-инкремент
Разбираемся как работает пре-инкремент и пост-инкремент на примере классической задачки в java: a++ + ++a
🔥4❤1👍1
Сложность: ⭐️⭐️⭐️⭐️🌚 (4/5)
Время на чтение: 10 мин
Если одним прекрасным утром вместо желанного "Привет мир!" в консоли ты увидел "§±§в§Ъ§У§Ц§д §Ю§Ъ§в!" - добро пожаловать в дивный мир кодировок и Java
Поэтому если в работе ты столкнешься с неправильно работающими кодировками и не знаешь что делать - не расстраивайся! теперь ты "не знаешь что делать с кодировками" чуть меньше чем окружающие😄
Время на чтение: 10 мин
Если одним прекрасным утром вместо желанного "Привет мир!" в консоли ты увидел "§±§в§Ъ§У§Ц§д §Ю§Ъ§в!" - добро пожаловать в дивный мир кодировок и Java
Поэтому если в работе ты столкнешься с неправильно работающими кодировками и не знаешь что делать - не расстраивайся! теперь ты "не знаешь что делать с кодировками" чуть меньше чем окружающие😄
2.5K🔥6👍1🙏1
Четко про классы и объекты!🤓🎓
Класс - это чертеж, по которому строятся объекты этого класса. Чертеж рассказывает какие поля (свойства) и методы (возможности, функционал) есть у этого объекта.
Чертеж существует в единственном экземпляре. А вот объектов на базе чертежа можно создать сколько угодно.
Так же и архитектор один раз создает чертеж дома (класс), по которому затем могут быть построены десятки и сотни реальных домов (объектов).🗒🏠🏠🏠
Так же как и у повара может быть форма для печенья в виде звездочки. Форма одна (класс), а вот печенек-звездочек (объектов) с ней можно сделать сколько угодно⭐️🍪🍪🍪
P.S. на инфографике зашифровано название фильма, можете испытать себя:)
Класс - это чертеж, по которому строятся объекты этого класса. Чертеж рассказывает какие поля (свойства) и методы (возможности, функционал) есть у этого объекта.
Чертеж существует в единственном экземпляре. А вот объектов на базе чертежа можно создать сколько угодно.
Так же и архитектор один раз создает чертеж дома (класс), по которому затем могут быть построены десятки и сотни реальных домов (объектов).🗒🏠🏠🏠
Так же как и у повара может быть форма для печенья в виде звездочки. Форма одна (класс), а вот печенек-звездочек (объектов) с ней можно сделать сколько угодно⭐️🍪🍪🍪
P.S. на инфографике зашифровано название фильма, можете испытать себя:)
🔥5❤1
Выбери статические поля для классе Pizza! Все что не выберешь - считается нестатическим, обычным полем.
Anonymous Poll
12%
boolean естьСырныйБортик
64%
double процентСгоревшихПицц
16%
int размер
20%
String имяПриготовившегоПовара
68%
int количествоВыпеченныхПицц
72%
Pizza последняяПриготовленнаяПицца
84%
String маркаПечиПоУмолчанию
8%
int вес
16%
String названиеПиццы
🍕Что бы разобраться в разнице статики и нестатики - надо понимать разницу между классом и объектом.
Статические поля - поля класса. А нестатические - поля объекта. И раз объектов можно создать много - то у каждого из объектов будет свой набор нестатических полей. А вот статические поля - общие, и сколько бы объектов мы ни создали - они останутся в единственном экземпляре.
Небольшой момент - рассуждать о статичности/нестатичности полей мы будем исходя из образа пиццерии, в меню которой есть несколько разных пицц и штат поваров.
🔢процентСгоревшихПицц - каждому объекту пиццы такая информация точно не нужна! это статистика о созданных объектах - так пусть она хранится на уровне класса, в единственном экземпляре.
🔖названиеПиццы - пиццы которые мы готовим могут быть разными - пепперони, мясной пир, четыре сыра - и эту разницу, это свойство каждой пиццы - важно хранить в самом объекте. Поле названиеПиццы можно было бы сделать статическим только в случае если в нашей пиццерии пицца готовится по одному единственному рецепту.
🏋️вес - некоторые пиццы бывают тяжелее, некоторые легче - в зависимости от их размера и набора ингредиентов. поэтому вес - описание конкретного объекта
🧑🍳имяПриготовившегоПовара - сегодня на смене работают Гордон и Уолтер, и было бы здорово знать кто приготовил конкретный объект пиццы
🔥маркаПечиПоУмолчанию - ясен красен что такая характеристика - общая для всех пицц! Несем поле в статику.
🍕последняяПриготовленнаяПицца - в каждом объекте пиццы эта информация ни к чему. А вот в классе - пожалуйста!
📦размер - пиццы бывают маленькие, большие, и гигантские! Размер - характеристика конкретного объекта.
🔢количествоВыпеченныхПицц - опять статика, опять информация, которую не нужно дублировать в каждом объекте, которая скорее косвенно относится ко всем-всем-всем пиццам.
🧀естьСырныйБортик - еще одна щепотка индивидуальности каждого объекта пиццы! Как кот шредингера - может быть у пиццы, а может не быть. Нестатическое поле.
Статические поля - поля класса. А нестатические - поля объекта. И раз объектов можно создать много - то у каждого из объектов будет свой набор нестатических полей. А вот статические поля - общие, и сколько бы объектов мы ни создали - они останутся в единственном экземпляре.
Небольшой момент - рассуждать о статичности/нестатичности полей мы будем исходя из образа пиццерии, в меню которой есть несколько разных пицц и штат поваров.
🔢процентСгоревшихПицц - каждому объекту пиццы такая информация точно не нужна! это статистика о созданных объектах - так пусть она хранится на уровне класса, в единственном экземпляре.
🔖названиеПиццы - пиццы которые мы готовим могут быть разными - пепперони, мясной пир, четыре сыра - и эту разницу, это свойство каждой пиццы - важно хранить в самом объекте. Поле названиеПиццы можно было бы сделать статическим только в случае если в нашей пиццерии пицца готовится по одному единственному рецепту.
🏋️вес - некоторые пиццы бывают тяжелее, некоторые легче - в зависимости от их размера и набора ингредиентов. поэтому вес - описание конкретного объекта
🧑🍳имяПриготовившегоПовара - сегодня на смене работают Гордон и Уолтер, и было бы здорово знать кто приготовил конкретный объект пиццы
🔥маркаПечиПоУмолчанию - ясен красен что такая характеристика - общая для всех пицц! Несем поле в статику.
🍕последняяПриготовленнаяПицца - в каждом объекте пиццы эта информация ни к чему. А вот в классе - пожалуйста!
📦размер - пиццы бывают маленькие, большие, и гигантские! Размер - характеристика конкретного объекта.
🔢количествоВыпеченныхПицц - опять статика, опять информация, которую не нужно дублировать в каждом объекте, которая скорее косвенно относится ко всем-всем-всем пиццам.
🧀естьСырныйБортик - еще одна щепотка индивидуальности каждого объекта пиццы! Как кот шредингера - может быть у пиццы, а может не быть. Нестатическое поле.
❤8🔥2👍1
🔥❄️Однажды мастер кунг-фу сказал своему ученику:
Сегодняшний пост - про горячие клавиши в Intellij IDEA, они же хоткеи. И да, мастер был прав, потому что с горячими клавишами ты сможешь противостоять натиску даже 10000 срочных и коварных задач.
Разберу самые важные из хоткеев для начинающих:
Alt + Enter - Наведя курсор на любой участок кода - можно получить предложения идеи по альтернативам/улучшению/оптимизации этого кода. Чаще всего полезно нажать когда курсор наведен на подсвеченный красным код - идея предложит быстрый вариант решения проблемы.
Alt + Insert - Генерация фрагментов типового кода (конструкторы, геттеры-сеттеры, переопределение методов). Т.е. все то что нам скучно делать самим.
Shift + Shift (быстро дважды нажать шифт) - Открыть универсальный поиск. Можно искать все что угодно - и код, и текст, и команды и настройки в идее, и вообще все
Ctrl + Shift + F - Поиск по файлам проекта - более специализированный поиск
Ctrl + W / Ctrl + Shift + W - Увеличение/уменьшение выделения фрагмента кода. Удерживая Ctrl и последовательно нажимая W можно выделить текст от одного слова до целого метода и дальше до целого класса
Ctrl + D - Дублирование текущей строки / выделенного фрагмента. Самый полезный и экономящий время хоткей!
Ctrl + / - Комментирование текущей строки / выделенного фрагмента
Alt + Shift + клавиша вверх/вниз - Переместить строку / выделенный фрагмент выше или ниже на одну строку
Ctrl + B - Войти в определение метода, на котором стоит курсор
Ctrl + Alt + L - Автоматическое форматирование (правильные переносы и отступы в текущем классе)
Alt + 1 - Открыть/закрыть проектное дерево
Alt + 7 - Открыть/закрыть структуру класса
Есть еще много важных хоткеев, но для начала начни практиковать эти. В будущих постах продолжу список этих полезностей.
Бонусом - пара советов.
1. Если забыл хоткей - запусти глобальнй поиск (Double Shift) - и введи "Keyboard Shortcuts PDF" - это встроенная в Intellij IDEA шпаргалка по горячим клавишам.
2. Установи плагин "Key promoter X plugin" - https://plugins.jetbrains.com/plugin/9792-key-promoter-x
Эта штука подобно сенсею будет каждый раз тебе подсказывать какие действия ты сейчас совершаешь мышкой, а мог бы заменить на хоткеи.
И помни: хоткеи > движения мышкой. Работая с клавиатурой и хоткеями ты программируешь быстро и стильно, подобно хищной и безжалостной кобре🐍
"Держи разум холодным, а клавиши - горячими."
Сегодняшний пост - про горячие клавиши в Intellij IDEA, они же хоткеи. И да, мастер был прав, потому что с горячими клавишами ты сможешь противостоять натиску даже 10000 срочных и коварных задач.
Разберу самые важные из хоткеев для начинающих:
Alt + Enter - Наведя курсор на любой участок кода - можно получить предложения идеи по альтернативам/улучшению/оптимизации этого кода. Чаще всего полезно нажать когда курсор наведен на подсвеченный красным код - идея предложит быстрый вариант решения проблемы.
Alt + Insert - Генерация фрагментов типового кода (конструкторы, геттеры-сеттеры, переопределение методов). Т.е. все то что нам скучно делать самим.
Shift + Shift (быстро дважды нажать шифт) - Открыть универсальный поиск. Можно искать все что угодно - и код, и текст, и команды и настройки в идее, и вообще все
Ctrl + Shift + F - Поиск по файлам проекта - более специализированный поиск
Ctrl + W / Ctrl + Shift + W - Увеличение/уменьшение выделения фрагмента кода. Удерживая Ctrl и последовательно нажимая W можно выделить текст от одного слова до целого метода и дальше до целого класса
Ctrl + D - Дублирование текущей строки / выделенного фрагмента. Самый полезный и экономящий время хоткей!
Ctrl + / - Комментирование текущей строки / выделенного фрагмента
Alt + Shift + клавиша вверх/вниз - Переместить строку / выделенный фрагмент выше или ниже на одну строку
Ctrl + B - Войти в определение метода, на котором стоит курсор
Ctrl + Alt + L - Автоматическое форматирование (правильные переносы и отступы в текущем классе)
Alt + 1 - Открыть/закрыть проектное дерево
Alt + 7 - Открыть/закрыть структуру класса
Есть еще много важных хоткеев, но для начала начни практиковать эти. В будущих постах продолжу список этих полезностей.
Бонусом - пара советов.
1. Если забыл хоткей - запусти глобальнй поиск (Double Shift) - и введи "Keyboard Shortcuts PDF" - это встроенная в Intellij IDEA шпаргалка по горячим клавишам.
2. Установи плагин "Key promoter X plugin" - https://plugins.jetbrains.com/plugin/9792-key-promoter-x
Эта штука подобно сенсею будет каждый раз тебе подсказывать какие действия ты сейчас совершаешь мышкой, а мог бы заменить на хоткеи.
И помни: хоткеи > движения мышкой. Работая с клавиатурой и хоткеями ты программируешь быстро и стильно, подобно хищной и безжалостной кобре🐍
🔥10👍2❤1
Дорогие друзья, с наступающим!❄️ Узнавать новое - наша ежедевная работа, но иногда - надо просто от всего отдохнуть, отключиться. Один мой друг поделился классной метафорой о том, что брать паузы на отдых - так же важно, как будучи за рулем автомобиля - останавливаться подзаправиться.
🚙Вовремя не заправишься (не отдохнешь) - поедешь "на парах", пропадет тяга, пойдут вибрации.
🚕Если и после этого не заправишься - просто встанешь намертво и будешь еле-еле толкать машину.
🚗Если заправишься абы чем - двигатель долго не проходит. И так далее.
Аналогии с жизнью чувствуете? Поэтому желаю вам всем качественно заправиться, отдохнуть и пополнить запас сил. Что бы быть готовыми к по настоящему великим делам и достижениям, которые заставят вас собой гордиться. Желаю вам счастливого Нового года, тяги к знаниям и твердой воли🎄🎄🎄
ПС В этой авто-метафоре, что бы не ехать непойми куда - неплохо еще и планировать свой путь. Коллеги подкинули бесплатный планер https://yearcompass.com/ru/ - мне немного помогло структурировать свои цели на 2024, возможно поможет и кому-то из вас. (впрочем до конца я его так и не заполнил, шутка ли, 20 страниц😁буду еще сидеть)
🚙Вовремя не заправишься (не отдохнешь) - поедешь "на парах", пропадет тяга, пойдут вибрации.
🚕Если и после этого не заправишься - просто встанешь намертво и будешь еле-еле толкать машину.
🚗Если заправишься абы чем - двигатель долго не проходит. И так далее.
Аналогии с жизнью чувствуете? Поэтому желаю вам всем качественно заправиться, отдохнуть и пополнить запас сил. Что бы быть готовыми к по настоящему великим делам и достижениям, которые заставят вас собой гордиться. Желаю вам счастливого Нового года, тяги к знаниям и твердой воли🎄🎄🎄
ПС В этой авто-метафоре, что бы не ехать непойми куда - неплохо еще и планировать свой путь. Коллеги подкинули бесплатный планер https://yearcompass.com/ru/ - мне немного помогло структурировать свои цели на 2024, возможно поможет и кому-то из вас. (впрочем до конца я его так и не заполнил, шутка ли, 20 страниц😁буду еще сидеть)
❤8🔥3👍2
Хелоу, на ночь глядя - о мапперах, библиотеке MapStruct и чайных делах.
Что делать если я тестирую API, и для одного и того же по смыслу предмета от одного эндпоинта приходит одна модель данных, а от другого другая?
На примере - представим APIшку магазина китайского чая🫖
У APIшки есть два эндпоинта:
1. ➕эндпоинт для добавления нового сорта чая в ассортимент магазина
POST /tea
в теле запроса отправляется json с данными о добавляемом сорте чая, типа такого:
2. ☕️эндпоинт для получения рекомендуемого чая сезона
GET /teaOfTheDay
а в теле ответа возвращается объект:
Чертовски похожие объекты, что там чай, что там чай, ну окей. Смоделировать json-объект отправляемого чая (1) и возвращаемого чая (2) можно такими нехитрыми ДТОшками с применением аннотации @Data (lombok):
Мы видим что речь идет о практически идентичных объектах. Но их сложно сравнивать друг с другом по следующим причинам:
1. Tea & ShopTea - объекты разного типа
2. имена/состав полей не соответствуют друг другу или соответствуют не полностью (к примеру поля teaName & newTeaName хранят по сути одинаковую информацию но называются по разному)
А еще возможно что у вас уже написано немало методов-утилит для работы с классом Tea, но вот объект ShopTea туда уже не передать.
Задача перед нами - превратить объект типа ShopTea в объект типа Shop. Для таких превращений выделяют специальные классы-мапперы (mapper):
Вроде и неплохо, но логику преобразования пришлось написать ручками. А самое главное - в жизни в json от сервисов - намного больше полей (десятки), и рукописного труда оказалось бы дофига. Тут и врывается MapStruct - для генерации таких классов-мапперов. Код для маппера с применением MapStruct будет выглядеть вот так:
Причем логику преобразования совпадающих по имени-типу полей можно вообще не описывать - через @Mapping нам пришлось описать только особый случай, когда поля не совпадали по имени. Ну а если поле у первого объекта совпадает с полем второго и по типу и по имени - никаких аннотаций писать не надо.
Для работы этой библиотеки надо:
1. указать ее как зависимость
2. настроить ее работу с плагином компилятора
3. применить в коде
И все это, с пылу-с жару подготовленное для вас - находится здесь:
https://gitlab.com/RevRay/mapstruct-demo
Пункты 1 и 2 выполняются в pom.xml для Maven-проекта, а пункт 3 - код для разобранного выше примера - есть в классе MapStructTest.
Изучайте пример, читайте документацию (https://mapstruct.org/), пейте вкусный чай и пишите мапперы как преисполнившиеся в своем познании люди🤓
Что делать если я тестирую API, и для одного и того же по смыслу предмета от одного эндпоинта приходит одна модель данных, а от другого другая?
На примере - представим APIшку магазина китайского чая🫖
У APIшки есть два эндпоинта:
1. ➕эндпоинт для добавления нового сорта чая в ассортимент магазина
POST /tea
в теле запроса отправляется json с данными о добавляемом сорте чая, типа такого:
{
"newTeaName": "Жоу Гуй",
"type": "улун"
}2. ☕️эндпоинт для получения рекомендуемого чая сезона
GET /teaOfTheDay
а в теле ответа возвращается объект:
{
"id":"2"
"teaName":"Жоу Гуй"
"type":"улун"
}Чертовски похожие объекты, что там чай, что там чай, ну окей. Смоделировать json-объект отправляемого чая (1) и возвращаемого чая (2) можно такими нехитрыми ДТОшками с применением аннотации @Data (lombok):
@Data
public class Tea {
private String newTeaName;
private String type;
}
@Data
public class ShopTea {
private int id;
private String teaName;
private String type;
}
Мы видим что речь идет о практически идентичных объектах. Но их сложно сравнивать друг с другом по следующим причинам:
1. Tea & ShopTea - объекты разного типа
2. имена/состав полей не соответствуют друг другу или соответствуют не полностью (к примеру поля teaName & newTeaName хранят по сути одинаковую информацию но называются по разному)
А еще возможно что у вас уже написано немало методов-утилит для работы с классом Tea, но вот объект ShopTea туда уже не передать.
Задача перед нами - превратить объект типа ShopTea в объект типа Shop. Для таких превращений выделяют специальные классы-мапперы (mapper):
public class OldTeaMapper {
Tea shopTeaToTea(ShopTea shopTea) {
Tea tea = new Tea();
tea.setNewTeaName(shopTea.getTeaName());
tea.setType(shopTea.getType());
return tea;
}
}Вроде и неплохо, но логику преобразования пришлось написать ручками. А самое главное - в жизни в json от сервисов - намного больше полей (десятки), и рукописного труда оказалось бы дофига. Тут и врывается MapStruct - для генерации таких классов-мапперов. Код для маппера с применением MapStruct будет выглядеть вот так:
@Mapper
public interface MapStructTeaMapper {
@Mapping(source = "teaName", target = "newTeaName")
Tea shopTeaToTea(ShopTea shopTea);
}
Причем логику преобразования совпадающих по имени-типу полей можно вообще не описывать - через @Mapping нам пришлось описать только особый случай, когда поля не совпадали по имени. Ну а если поле у первого объекта совпадает с полем второго и по типу и по имени - никаких аннотаций писать не надо.
Для работы этой библиотеки надо:
1. указать ее как зависимость
2. настроить ее работу с плагином компилятора
3. применить в коде
И все это, с пылу-с жару подготовленное для вас - находится здесь:
https://gitlab.com/RevRay/mapstruct-demo
Пункты 1 и 2 выполняются в pom.xml для Maven-проекта, а пункт 3 - код для разобранного выше примера - есть в классе MapStructTest.
Изучайте пример, читайте документацию (https://mapstruct.org/), пейте вкусный чай и пишите мапперы как преисполнившиеся в своем познании люди🤓
GitLab
Aleksandr Kuzmichev / mapstruct-demo · GitLab
🔥8🤔1

