Telegram Web Link
🖥 Хороший стиль обработки ошибок

Правильная и хорошая обработка ошибок — довольно важная часть в разработке. Но как это делать правильно?

Когда делать 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
🖥 Как работает этот код?

А ты знаешь, что будет при запуске этого кода на Java?
for (byte i = 126; i<=127; i++) {
System.out.println(i);
}


Возникнет бесконечный цикл, код будет выполняться без остановки. Хороший вопрос: почему так происходит? Ведь если написать i < 127, то всё работает нормально.
Дело в том, что byte имеет значения от -128 до 127. Поэтому 127+1 даёт -128 и условие <=127 всегда истинно.
Такие дела


@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как скомпилировать исходники Java вручную

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

🟡Класс 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


🟡Но когда мы говорим о приложении, то ожидаем увидеть один файл, а не кучу папок. Давайте упакуем наши class-файлы в jar-архив. В этом нам поможет одноимённая утилита.
jar cfe hello.jar ru.devmark.HelloWorld ru

Опция c говорит, что нужно создать новый архив, f задаёт имя будущего архива, а e указывает полное имя main-класса. В конце указываем папку, в которой лежат все class-файлы.

📎 Читать подробнее
📎 YouTube

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Юнит-тесты: чек-лист методик проектирования

Держите полезную статью о тестах в Java и не только.
Основная идея заключается в том, чтобы не просто писать тесты, а максимально эффективно покрывать функциональность при минимуме написанных тестов. Главная помощь этих тестов будет заметна при рефакторинге приложения.

Что внутри?
• Проектирование тестов
• Методики проектирования
• Уровни тестов
• Эквивалентное разделение
• Анализ граничных значений
• Доменный анализ
• Тестовая комбинаторика

📎 Статья

@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.
🖥 Полный гайд по алгоритмам сортировки на Java

В этой статье разбираются алгоритмы сортировки 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
💻 Запуск Kotlin кода без IDE

▶️Итак, вопрос: как скомпилировать простенький код написанный на Kotlin без IDE?


▶️Вот пошаговая инструкция:

1. Загрузить компилятор. Найти последнюю версию можно здесь.

2. Распаковать компилятор в отдельную папку, добавить 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


▶️Теперь кратко о создании и запуске простого приложения.

1. Создаем файл - `hello.kt` со следующим кодом:

fun main(args: Array<String>) {
println("Hello, World!")
}


2. Компилируем, используя командную строку:

$ kotlinc hello.kt -include-runtime -d hello.jar

Подробнее о флагах компиляции можно почитать в мане:
$ kotlinc -help


3. Запускаем приложение:

$ java -jar hello.jar


📎Более подробно о других вариантах установки компилятора, компиляции библиотек, запуске Kotlin-скриптов и прочем в доках

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как реализовать потокобезопасную неблокирующую очередь на Java

🟡Итак, задача: нужно реализовать потокобезопасную (Thread Safe) неблокирующую очередь на Java.
Нельзя использовать локи или 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 в контейнере: особенности эксплуатации

Держите хороший доклад о том, как использовать Java вместе с Docker-контейнерами.
В докладе освещены нюансы работы Linux, контейнеризации и JVM друг с другом.
Рассказывается про использование ресурсов системы и особенности работы лимитов, сетевые особенности контейнеров и диагностика JVM в контейнере.

План:
• Контейнеры и его особенности
• Настройка памяти и файловой системы в контейнерах
• Управление памятью в контейнерах
• Работа с памятью в контейнерах
• Работа с контейнерами
• Файловая система контейнеров
• Диагностика контейнеров
• Настройка и использование GVM
• Настройка и использование JMX
• Альтернативные решения

📎 YouTube
📎 Презентация

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Отличный учебник по Java

Здесь раскрыты самые основные темы + много примеров кода.
Самое то, чтобы освежить какие-то моменты перед собеседованием.

🟡Оглавление
├╼ Типы данных
├╼ Литералы
├╼ Переменные и константы
├╼ Операторы
├╼ Управляющие последовательности
├╼ Модификаторы
├╼ Ввод с клавиатуры
├╼ Особенности строк
├╼ Коллекции
├╼ Дата и время
├╼ Исключения
╰╼ Интерфейсы

📚 Учебник

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2024/11/19 22:18:05
Back to Top
HTML Embed Code: