Правильная и хорошая обработка ошибок — довольно важная часть в разработке. Но как это делать правильно?
RuntimeException
, а когда просто Exception
throw
?MyException extends Exception
, а затем MyOtherException extends MyException
? Иными словами, как увидеть необходимость в иерархии ошибок?public void f() throws MyException {
//некоторый код ...
if (....){
throw MyException(...);
}
}
... f() throws ...
)?Во-первых, используйте исключения. Создайте свою иерархию исключений и продумайте, какие из них сделать *runtime*, а какие нет. Никогда не используйте конструкции типа
new Exception(...)
или new RuntimeException
. Вместо этого старайтесь создавать и кидать только адекватные ситуации исключения. Создание экземпляра Exception
или RuntimeException
— халтура и отписка вместо обработки ошибок.Не забывайте проверять все параметры в конструкторах и, по возможности, в методах и своевременно кидать
IllegalArgumentException
. Пользуйтесь стандартными исключениями в соответствующих случаях. Используйте их по назначению и никогда не кидайте что попало.Пользуйтесь
try
/catch
/finally
. Не забывайте уничтожать ресурсы.Пользуйтесь логгерами, а не делайте
e.printStackTrace
. Никогда не делайте catch
пустым, если только вы не уверены, что должны именно проигнорировать исключение.При логгировании пользуйтесь по возможности полный метод
log
с уровнем логгирования, сообщением и исключением. Старайтесь в сообщении к логу описать, что именно упало и добавить какие-то сведения об условиях в блоке try
. Это поможет выявить проблемы в боевых условиях. Старайтесь назначать адекватные уровни логгирования.@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
for (byte i = 126; i<=127; i++) {
System.out.println(i);
}
Дело в том, что byte имеет значения от -128 до 127. Поэтому 127+1 даёт -128 и условие <=127 всегда истинно.
Такие дела
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Наш проект будет состоять всего из двух классов, причём один будет вызывать метод другого.
Greeter
содержит метод sayHello()
. Этот метод выводит приветствие на экран:package ru.devmark.helper;
public class Greeter {
public void sayHello() {
System.out.println("Привет, мир!");
}
}
Greeter.java
.package ru.devmark;
import ru.devmark.helper.Greeter;
public class HelloWorld {
public static void main(String[] args) {
var greeter = new Greeter();
greeter.sayHello();
}
}
Сохраним исходный код этого класса в файле
HelloWorld.java
.main()
, этот класс можно использовать как точку входа для нашего приложения (так называемый «Main-Class»). Внутри мы создаём экземпляр класса Greeter
, вызываем его единственный метод и выводим результат на экран.javac
, которая поставляется вместе с jdk
. Выполним эту команду в той папке, где лежат оба наших файла:javac -d . *.java
Опция
-d
указывает, куда сложить скомпилированные файлы. В результате в нашей папке помимо исходников появится иерархическая структура папок и файлов:├── Greeter.java
├── HelloWorld.java
└── ru
└── devmark
├── HelloWorld.class
└── helper
└── Greeter.class
jar cfe hello.jar ru.devmark.HelloWorld ru
Опция
c
говорит, что нужно создать новый архив, f
задаёт имя будущего архива, а e
указывает полное имя main
-класса. В конце указываем папку, в которой лежат все class-файлы.@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Основная идея заключается в том, чтобы не просто писать тесты, а максимально эффективно покрывать функциональность при минимуме написанных тестов. Главная помощь этих тестов будет заметна при рефакторинге приложения.
Что внутри?
• Проектирование тестов
• Методики проектирования
• Уровни тестов
• Эквивалентное разделение
• Анализ граничных значений
• Доменный анализ
• Тестовая комбинаторика
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Всё, что будет на митапе, останется на митапе 💥
24 апреля в 19:00 встречаемся на Alfa Backend Stories #3 в Москве и онлайн.
Обсудим ИИ и другие инструменты, которые помогают в написании кода:
Андрей Свиридов, ведущий разработчик, поделиться советами о том, как повысить качество кода в приложениях
Дмитрий Сошников, технический руководитель лаборатории генеративного ИИ Школы дизайна НИУ ВШЭ и консультант Yandex Cloud, расскажет о современном искусственном интеллекте в облаке и покажет, как YandexGPT может использоваться разработчиками для решения прикладных задач
Антон Гращенков, в режиме реального времени покажет, как локально установить и настроить ИИ, а также как с его помощью писать код
Обещаем не стирать вам память, если вы придёте в костюме, в образе агентов фильма «Люди в чёрном»
Регистрация
Еще больше полезного в комьюнити: @alfabackend
erid: LjN8Kbsmr
Реклама. АО «Альфа-Банк». ИНН 7728168971.
24 апреля в 19:00 встречаемся на Alfa Backend Stories #3 в Москве и онлайн.
Обсудим ИИ и другие инструменты, которые помогают в написании кода:
Андрей Свиридов, ведущий разработчик, поделиться советами о том, как повысить качество кода в приложениях
Дмитрий Сошников, технический руководитель лаборатории генеративного ИИ Школы дизайна НИУ ВШЭ и консультант Yandex Cloud, расскажет о современном искусственном интеллекте в облаке и покажет, как YandexGPT может использоваться разработчиками для решения прикладных задач
Антон Гращенков, в режиме реального времени покажет, как локально установить и настроить ИИ, а также как с его помощью писать код
Обещаем не стирать вам память, если вы придёте в костюме, в образе агентов фильма «Люди в чёрном»
Регистрация
Еще больше полезного в комьюнити: @alfabackend
erid: LjN8Kbsmr
Реклама. АО «Альфа-Банк». ИНН 7728168971.
В этой статье разбираются алгоритмы сортировки Java и примеры их реализации. В том числе выясняется, как выбрать подходящий алгоритм для конкретной задачи.
Особенно актуально для собеседующихся)
Квадратичная сложность — O(n²):
├╼
сортировка вставкой Java;├╼
сортировка выбором Java;╰╼
сортировка пузырьком Java.Логарифмическая сложность — O(n log n):
├╼
сортировка слиянием Java;├╼
пирамидальная сортировка Java;├╼
быстрая сортировка Java;╰╼
сортировка Шелла на Java.O(n+K):
╰╼
сортировка подсчетом Java.@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
bin
директорию в переменную окружения PATH
. Об этом можно почитать тут. Bin
содержит скрипты, необходимые для сборки и запуска кода на Windows, OS X и Linux.Другой вариант установки компилятора: для OS X, Linux, Cygwin, FreeBSD или Solaris (возможно, и другие UNIX-системы), то можно использовать SDKMAN https://sdkman.io/.
Запускаем в терминале:
$ curl -s https://get.sdkman.io | bash
Затем следуем инструкциям. Потом потребуется открыть новое окно терминала и установить Kotlin с помощью команды:
$ sdk install kotlin
fun main(args: Array<String>) {
println("Hello, World!")
}
$ kotlinc hello.kt -include-runtime -d hello.jar
Подробнее о флагах компиляции можно почитать в мане:
$ kotlinc -help
$ java -jar hello.jar
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Нельзя использовать локи или
synchonized
, при этом очередь должна корректно работать в многопоточной среде.В основе неблокирующих алгоритмов лежит использование атомарной CAS (Compare-and-Swap или Compare-and-Set) операции. В Java для этого можно использовать атомики, которые поддерживают эти атомарные операции.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
На собеседовании может всплыть вопрос в духе: "Что будет являться монитором для блока кода, помеченного сразу двумя аннотациями
@Synchronized
и @JvmStatic
в Котлин?". Держите полезную статью, в которой рассматривается, для чего используются данные аннотации и каким будет результат при их одновременном использовании.
А пока немного о
@Synchronized
и @JvmStatic
:@Synchronized
в Kotlin является аннотацией для методов и блоков кода, которая обеспечивает синхронизацию доступа к ним между потоками. Когда метод или блок кода помечены аннотацией @Synchronized
, только один поток может получить право их выполнения в определенный момент времени, остальные потоки будут ожидать освобождения монитора, прежде чем получить доступ. Это позволяет избежать состояния гонки и обеспечить правильное выполнение кода в многопоточной среде.@JvmStatic
в Kotlin указывает компилятору, что функция или свойство должны быть статическими в Java-коде после компиляции. Когда мы используем @JvmStatic
перед функцией или свойством в объекте- компаньоне или внутри объекта, компилятор Kotlin создает соответствующий статический элемент в Java-коде. Это позволяет вызывать этот элемент напрямую из Java-кода, без необходимости ссылаться на экземпляр класса или объекта.@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите хороший доклад о том, как использовать Java вместе с Docker-контейнерами.
В докладе освещены нюансы работы Linux, контейнеризации и JVM друг с другом.
Рассказывается про использование ресурсов системы и особенности работы лимитов, сетевые особенности контейнеров и диагностика JVM в контейнере.
План:
• Контейнеры и его особенности
• Настройка памяти и файловой системы в контейнерах
• Управление памятью в контейнерах
• Работа с памятью в контейнерах
• Работа с контейнерами
• Файловая система контейнеров
• Диагностика контейнеров
• Настройка и использование GVM
• Настройка и использование JMX
• Альтернативные решения
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Здесь раскрыты самые основные темы + много примеров кода.
Самое то, чтобы освежить какие-то моменты перед собеседованием.
├╼
Типы данных├╼
Литералы├╼
Переменные и константы├╼
Операторы├╼
Управляющие последовательности├╼
Модификаторы├╼
Ввод с клавиатуры├╼
Особенности строк├╼
Коллекции├╼
Дата и время├╼
Исключения╰╼
Интерфейсы📚 Учебник
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM