В качестве результата пришлите ссылки на ваши GitHub-проекты в личном кабинете студента на сайте netology.ru.
Все задачи этого занятия нужно делать в разных репозиториях.
Важно: если у вас что-то не получилось, то оформляйте Issue по установленным правилам.
- Инициализируйте на своём компьютере пустой Git-репозиторий
- Добавьте в него готовый файл .gitignore
- Добавьте в этот же каталог необходимые файлы
- Сделайте необходимые коммиты
- Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым
- Сделайте пуш (удостоверьтесь, что ваш код появился на GitHub)
- Ссылку на ваш проект отправьте в личном кабинете на сайте netology.ru
- Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачета (в этом ДЗ все задачи являются обязательными)
Вы развиваете приложение с менеджером товаров, который мы рассматривали на лекции, и решили сделать так, чтобы при попытке удаления несуществующего объекта генерировалось ваше исключение, а не ArrayIndexOfBoundsException
.
Обратите внимание: это правильный подход, поскольку таким образом вы сообщаете (через генерацию исключения), что это исключение, вписывающееся в вашу логику, а не ошибка программиста.
Исключения являются частью API.
Что нужно сделать:
- Возьмите проект (мы его писали на одной из предыдущих лекций) с менеджером, репозиторием и товарами (
Product
,Book
,TShirt
) - Создайте класс исключения
NotFoundException
отнаследовавшись отRuntimeException
и реализуйте все конструкторы - В методе удаления
removeById
сначала проверяйте, есть ли элемент (для этого прямо из методаremoveById
вызывайте методfindById
: если результат -null
, тогда выкидывайте исключениеNotFoundException
*) - Напишите 2 автотеста на репозиторий: первый должен проверять успешность удаления существующего элемента, второй - генерации
NotFoundException
при попытке удаления несуществующего элемента
Убедитесь, что ваши автотесты проходят (напоминаем, что проект должен быть на базе Maven, с подключенными зависимостями и необходимыми плагинами).
Итого: у вас должен быть репозиторий на GitHub, в котором расположен ваш Java-код и автотесты к нему.
Примечание*: обратите внимание, когда генерируются стандартные исключения, всегда передаётся сообщение (на английском языке), например:
Мы рекомендуем вам делать так же и указывать в сообщении: при удалении по какому конкретно id было сгенерировано ваше исключение.
Сделать это можно следующим образом (простейший способ): "Element with id: " + id + " not found"
.
К вам пришло веб-приложение, которое необходимо запустить и проверить его работоспособность.
Smoke-тест этого приложения будет заключаться в следующем: при выполнении запуска по инструкции приложение стартует и доступно по адресу http://localhost:9999 (нужно открыть браузер и "ручками" вбить адрес http://localhost:9999).
- Скачайте файл stracktrace.jar
- Откройте терминал в каталоге, в который вы скачали файл из п.1
- Запустите приложение командой
java -jar stacktrace.jar
Выполните запуск приложения по инструкции, убедитесь, что оно падает с красивым Stack Trace'ом.
Важно: приложение специально написано так, чтобы упасть! Поэтому не пробуйте его починить!
Что нужно сделать: нужно оформить баг-репорт (не забудьте скопировать весь стек-трейс).
Для этого:
- Создайте новый репозиторий
- В репозитории создайте issue (ознкомьтесь с тем, как оформлять issue в части кода*)
- Приложите к issue либо ссылку на файл, либо сам файл (
stacktrace.jar
)
Важно: не закидывайте стек-трейс как обычный код в issue! Оформляйте правильно и аккуратно.
Итого: у вас должен быть репозиторий на GitHub, в котором расположено ваше issue.
Когда вы будете рассматривать Stack Trace, общая структура будет вот такой:
java.lang.IllegalStateException: Failed to execute CommandLineRunner
...
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
...
Caused by: ...
Что это значит?
Если вы внимательно посмотрите на конструкторы исключений, то увидите, что есть возможность передавать другое исключение в качестве аргумента:
public class RuntimeException extends Exception {
...
public RuntimeException(String message, Throwable cause) {
super(message, cause);
}
public RuntimeException(Throwable cause) {
super(cause);
}
...
}
Зачем это нужно?
Это позволяет организовать "заворачивание исключений", а именно: происходит какое-то исключение, его перехватывают с помощью catch
и потом выбрасывают собственное:
try {
} catch (CannotGetJdbcConnectionException e) {
throw new IllegalStateException("CannotGetJdbcConnectionException", e);
}
"Переводится" это следующим образом: мы выкидываем своё исключение, потому что возникло другое исключение (в Stack Trace появляется Caused by
).
Как вы видели из Stack Trace к текущему заданию, таких "вкладываний" может быть очень много, и самым вложенным является то, которое ниже всех по Stack Trace.
Именно так в большинстве фреймворков Checked исключения заворачивают в Unchecked, чтобы нам с вами не приходилось выносить исключения в сигнатуру или писать try-catch
.