Java for Beginner
870 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Что такое Java Module System (Project Jigsaw)? 🤓

Ответ:

Java Module System
— это новая система модулей, появившаяся в Java 9.

Она добавляет уровень абстракции выше пакетов. Модуль описывается в файле
module-info.java, где указывается, какие пакеты он экспортирует (делает доступными для других модулей) и от каких модулей зависит (requires).

Это позволяет создавать надежные, хорошо инкапсулированные приложения, бороться с classpath hell и улучшать безопасность. JDK сам теперь разбит на модули, что позволяет создавать образы JRE только с нужными модулями (jlink).


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 24 апреля

ℹ️ Кто родился в этот день

Дэвид Гарольд Блэквелл (англ. David Harold Blackwell; 24 апреля 1919 — 8 июля 2010)американский статистик, внесший значительный вклад в теорию игр, теорию вероятностей, теорию информации и статистику. Доктор, эмерит-профессор статистики в Калифорнийском университете в Беркли (после преподавания там в 1954-1989), и является одним из авторов теоремы Рао — Блэквелла — Колмогорова. Стал первым афроамериканцем, избранным в Национальную академию наук США (1965) и первым тёмнокожим штатным преподавателем в Калифорнийском университете в Беркли. В марте 2024 года компания Nvidia представила семейство графических ускорителей на базе новой архитектуры Blackwell, названную в его честь.

Гидео́н (Гедео́н) Сундбэк (или Сандбек; нем. и швед. Gideon Sundbäck, англ. Gideon Sundback; 24 апреля 1880, Эдестугу, лен Йёнчёпинг, Швеция — 21 июня 1954, Мидвилл, Пенсильвания)
— шведско-американский инженер и изобретатель. Его самым известным изобретением является современная застёжка-молния, созданная им в 1913 году после года работы над ней. Ему удалось усовершенствовать застёжку Джадсона, лишив её крючков и увеличив количество скрепляющего элемента на единицу длины. Этот вариант застёжки имел два ряда зубчиков, которые цеплялись друг за друга. В 1914 году Сундбек изобрёл другой вариант «молнии без крючков», в которой зубчики имели углубление снизу и небольшой конический выступ сверху. Это изобретение было запатентовано в 1917 году.

Э́дмунд Ка́ртрайт (англ. Edmund Cartwright; 24 апреля 1743 — 30 октября 1823) — английский изобретатель. 4 апреля 1785 года Картрайт получил патент на механический ткацкий станок с ножным приводом, который в 40 раз увеличил производительность труда. По ходатайству 50 фабрикантов за свои изобретения Картрайт получил от парламента вознаграждение в 10 000 фунтов стерлингов. Картрайт известен также как поэт и агроном.


🌐 Знаковые события

1990 — запущен орбитальный телескоп Хаббл.

2003 — выход Windows Server 2003.

2005 — в видеохостинге YouTube опубликован первый видеоролик «Me at the zoo».


#Biography #Birth_Date #Events #24апреля
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Раздел 9. Исключения, логирование, отладка

Глава 1. Иерархия исключений (Exceptions)

Несколько ресурсов в try-with-resources: порядок закрытия и effectively final переменные (Java 9+)

Конструкция try-with-resources, появившаяся в Java 7, поддерживает объявление нескольких ресурсов в одном блоке, разделенных точкой с запятой. Спецификация языка Java (JLS, раздел 14.20.3) однозначно определяет порядок их закрытия: ресурсы закрываются в обратном порядке относительно порядка их инициализации.


Архитектурная логика обратного порядка

Рассмотрим типичный сценарий копирования данных:
try (FileInputStream fis = new FileInputStream("source.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("dest.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {

byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
}


В этом примере создается цепочка зависимостей: BufferedInputStream оборачивает FileInputStream, BufferedOutputStream оборачивает FileOutputStream. При закрытии необходимо соблюдать иерархию зависимостей — внешний обертчик должен быть закрыт до внутреннего ресурса, чтобы корректно сбросить буферизованные данные и освободить высокоуровневые ресурсы до низкоуровневых.

Согласно спецификации, закрытие произойдет в следующем порядке:
bos.close() — сброс буфера вывода и закрытие обертки
fos.close() — закрытие файлового потока вывода
bis.close() — закрытие обертки ввода
fis.close() — закрытие файлового потока ввода

Этот порядок гарантирует, что буферизованные данные будут корректно записаны на диск до закрытия файлового дескриптора, а ресурсы освобождаются от высокоуровневых абстракций к низкоуровневым примитивам.


Механизм компилятора

Компилятор Java трансформирует try-with-resources с несколькими ресурсами во вложенные блоки try-finally. Спецификация JLS определяет рекурсивную структуру: для двух ресурсов генерируется вложенный try, для трех — третий уровень вложенности и так далее . Каждый уровень отвечает за один ресурс и содержит логику suppressed exceptions.

Эквивалентный псевдокод для двух ресурсов:
// Псевдокод трансформации компилятором
{
final Resource r1 = new Resource("r1");
Throwable primaryExc1 = null;
try {
final Resource r2 = new Resource("r2");
Throwable primaryExc2 = null;
try {
// Основной блок
r1.work();
r2.work();
} catch (Throwable t) {
primaryExc2 = t;
throw t;
} finally {
if (r2 != null) {
if (primaryExc2 != null) {
try {
r2.close();
} catch (Throwable suppressed) {
primaryExc2.addSuppressed(suppressed);
}
} else {
r2.close();
}
}
}
} catch (Throwable t) {
primaryExc1 = t;
throw t;
} finally {
if (r1 != null) {
if (primaryExc1 != null) {
try {
r1.close();
} catch (Throwable suppressed) {
primaryExc1.addSuppressed(suppressed);
}
} else {
r1.close();
}
}
}
}


Важное следствие этой трансформации: если при создании второго ресурса возникает исключение, первый ресурс, уже успешно созданный, будет автоматически закрыт перед пробросом исключения. Это фундаментальное преимущество try-with-resources перед ручным управлением ресурсами, где при ошибке создания второго ресурса первый остался бы незакрытым.


#Java #для_новичков #beginner #exception #try_with_resources
👍3
Подводный камень: двойное закрытие и делегирование

Важно понимать, что многие обертки потоков в Java делегируют закрытие внутреннему ресурсу. BufferedReader.close() вызывает FileReader.close(), ObjectOutputStream.close() вызывает FileOutputStream.close(). В сочетании с обратным порядком закрытия try-with-resources это может привести к двойному вызову close() на одном и том же underlying ресурсе.
try (FileReader fr = new FileReader("file.txt");
BufferedReader br = new BufferedReader(fr)) {
// ...
}
// Закрытие: br.close() вызывает fr.close(), затем fr.close() вызывается повторно


Хотя большинство реализаций Closeable идемпотентны и повторный вызов close() безопасен, это не гарантируется интерфейсом AutoCloseable. При проектировании собственных ресурсов следует обеспечивать идемпотентность метода close() или отслеживать состояние закрытия.


JDBC: классический пример множественных ресурсов

Работа с JDBC демонстрирует практическую необходимость обратного порядка закрытия:
public List<User> findUsersByRole(String role) throws SQLException {
String query = "SELECT id, name, email FROM users WHERE role = ?";

try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery()) {

stmt.setString(1, role);
List<User> users = new ArrayList<>();

while (rs.next()) {
users.add(mapRowToUser(rs));
}
return users;
}
}


Закрытие произойдет в порядке: rs → stmt → conn. Это корректно, так как ResultSet зависит от PreparedStatement, который зависит от Connection. Закрытие в прямом порядке привело бы к попытке использования закрытого Statement при закрытии ResultSet, что вызвало бы SQLException.


Effectively final переменные в try-with-resources (Java 9+)

Проблема Java 7/8: принудительное объявление новой переменной

До Java 9 ресурсы в try-with-resources должны были объявляться непосредственно внутри круглых скобок после ключевого слова try. Это создавало избыточность, когда ресурс уже существовал во внешней области видимости и был готов к использованию:
// Java 7/8: избыточное объявление новой переменной
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
try (BufferedReader reader = br) { // Вынуждены создать reader, хотя br уже готов
String line = reader.readLine();
// ...
}

В этом примере br и reader ссылаются на один и тот же объект, но компилятор требует новую переменную внутри try. Это загромождает код и создает путаницу в именовании.


Решение Java 9: прямое использование существующих переменных


Java 9 (JEP 213) расширила синтаксис try-with-resources, позволяя использовать переменные, объявленные вне блока, при условии что они являются final или effectively final. Переменная считается effectively final, если ей присваивается значение ровно один раз и она не модифицируется впоследствии, даже без явного модификатора final.

Новый синтаксис:
// Java 9+: прямое использование существующей переменной
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
try (br) { // Нет необходимости в новой переменной
String line = br.readLine();
// ...
}


Для нескольких ресурсов синтаксис остается лаконичным:
// Java 9+: несколько effectively final ресурсов
final Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query); // effectively final

try (statement; resultSet) {
while (resultSet.next()) {
processRow(resultSet);
}
}


Важное ограничение: ресурс в скобках try должен быть именно переменной (expression name), а не произвольным выражением. Конструкция try (getResource()) по-прежнему недопустима.


#Java #для_новичков #beginner #exception #try_with_resources
👍3
Практическое применение: рефакторинг legacy-кода

Рассмотрим сценарий, где ресурс создается в одном методе, передается в другой, и должен быть закрыт после использования:
public class ReportGenerator {

public void generateMonthlyReport(Path outputPath) throws IOException {
// Ресурс создается здесь
BufferedWriter writer = Files.newBufferedWriter(outputPath);

try {
writeHeader(writer);
writeBody(writer);
writeFooter(writer);
} finally {
// Ручное закрытие до Java 9
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
logger.warn("Failed to close writer", e);
}
}
}
}
}


С Java 9 этот код упрощается:
public void generateMonthlyReport(Path outputPath) throws IOException {
BufferedWriter writer = Files.newBufferedWriter(outputPath);

try (writer) {
writeHeader(writer);
writeBody(writer);
writeFooter(writer);
}
// writer автоматически закрыт, suppressed exceptions сохранены
}



Критическое ограничение: безопасность при инициализации

Главное архитектурное отличие между классическим try-with-resources и синтаксисом effectively final переменных заключается в моменте захвата ресурса. Когда ресурс объявляется внутри try, компилятор гарантирует, что он будет закрыт даже если исключение возникнет при создании другого ресурса в том же блоке. С effectively final переменными эта гарантия теряется, так как ресурсы создаются вне try.
// Потенциально опасный код с effectively final
Resource r1 = new Resource("r1");
Resource r2 = new Resource("r2"); // Если здесь исключение — r1 не будет закрыт!

try (r1; r2) {
// ...
}


В этом примере, если конструктор r2 выбрасывает исключение, управление передается вне try-with-resources, и r1 остается незакрытым. В классическом синтаксисе try (Resource r1 = new Resource("r1"); Resource r2 = new Resource("r2")) ресурс r1 был бы закрыт автоматически перед пробросом исключения.

Рекомендация: использовать effectively final синтаксис только когда ресурсы уже гарантированно созданы и инициализированы, или когда логика приложения сама управляет их жизненным циклом до входа в try-with-resources.


Интеграция с try-catch-finally

Расширенный синтаксис Java 9 полностью совместим с традиционными catch и finally блоками. При наличии нескольких ресурсов, объявленных вне try, закрытие происходит перед входом в catch, а finally выполняется после обработки исключений:
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();

try (conn; stmt; rs) {
return extractResults(rs);
} catch (SQLException e) {
// Выполняется после закрытия всех ресурсов
throw new DataAccessException("Query failed: " + query, e);
} finally {
// Выполняется после catch, все ресурсы уже закрыты
metrics.recordQueryExecution(query, System.currentTimeMillis() - startTime);
}


Эволюция демонстрирует тенденцию к уменьшению шаблонного кода при сохранении безопасности. Java 7 устранила необходимость явного finally для закрытия, Java 9 устранила необходимость дублирования переменных.

#Java #для_новичков #beginner #exception #try_with_resources
👍4
Что выведет код?

import java.io.*;

public class Task240426 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("test"));

try (reader) {
System.out.print(reader.readLine());
}

reader.readLine();
}
}


#Tasks
👍3
Что такое JVM, JRE и JDK? В чем разница? 🤓

Ответ:

JVM (Java Virtual Machine)
— это виртуальная машина, которая выполняет байт-код Java. Обеспечивает кроссплатформенность.

JRE (Java Runtime Environment) — среда выполнения, включает JVM + библиотеки классов + другие компоненты для запуска Java-программ.

JDK (Java Development Kit) — комплект разработчика, включает JRE + инструменты для разработки (компилятор javac, отладчик jdb, javadoc, jar и др.).

Чтобы только запускать Java-программы, нужен JRE. Чтобы разрабатывать — JDK.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 25 апреля

ℹ️ Кто родился в этот день

Андре́й Никола́евич Колмого́ров (12 (25) апреля 1903, Тамбов — 20 октября 1987, Москва)советский математик, один из крупнейших математиков XX века. Один из основоположников современной теории вероятностей, им получены фундаментальные результаты в топологии, геометрии, математической логике, классической механике, теории турбулентности, теории сложности алгоритмов, теории информации, теории функций, теории тригонометрических рядов, теории меры, теории приближения функций, теории множеств, теории дифференциальных уравнений, теории динамических систем, функциональном анализе и в ряде других областей математики и её приложений. Автор новаторских работ по философии, истории, методологии и преподаванию математики, известны его работы в статистической физике (в частности, уравнение Джонсона — Мела — Аврами — Колмогорова).

Гулье́льмо Джова́нни Мари́я Марко́ни (итал. Guglielmo Giovanni Maria Marconi; 25 апреля 1874, Болонья — 20 июля 1937, Рим) — итальянский радиотехник, предприниматель и дипломат. Лауреат Нобелевской премии по физике за 1909 год совместно с Карлом Фердинандом Брауном «в знак признания их вклада в развитие беспроволочной телеграфии». Основатель Wireless Telegraph & Signal Company (впоследствии Marconi Company[англ.]). С именем Маркони во многих странах связывают начало практического применения радиосвязи.


🌐 Знаковые события

1826 — в Англии запатентован первый автомобиль с двигателем внутреннего сгорания.

1954 — американский исследовательский центр компании «Белл телефон» объявил о создании солнечных батарей.

2022 — Илон Маск купил «Твиттер» за 44 млрд долларов.


#Biography #Birth_Date #Events #25апреля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Сложный мем 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
6
🤣4🤓1
Вакансия.

Я вот чего-то в этой жизни не понимаю.

Как у джуна может быть 2-3 года опыта с высоконагруженными приложениями?

Kafka/RabbitMQ....

предстоит заниматься: Проводить перекрестный в code review; - это издёвка такая? Как джун может проводить перекрестное code review?

"ЧТО У ВАС ТУТ ПРОИСХОДИТ ?!" - спрашиваю как герой смешного мема.

Но мне бл не смешно как то.

Я по приколу откликнулся - уверен что получу ботовский отказ))))
😱8
Please open Telegram to view this post
VIEW IN TELEGRAM
😱2
История технологии сегодня — 26 апреля

ℹ️ Кто родился в этот день

Арно Аллан Пе́нзиас (англ. Arno Allan Penzias; 26 апреля 1933, Мюнхен — 22 января 2024, Сан-Франциско) — американский астрофизик, профессор, лауреат Нобелевской премии по физике (1978) за открытие космического микроволнового фонового излучения. Построив приёмник, способный детектировать излучение с длиной волны порядка миллиметра и присоединив его к 36-футовому радиотелескопу, Пензиас и Вильсон обнаружили в 1970 году спектральную линию окиси углерода в области туманности Ориона, а затем ещё шесть межзвёздных молекул. Открытие и исследование межзвёздных молекулярных облаков способствовало прогрессу в понимании образования и эволюции звёзд и галактик.


🌐 Знаковые события

1986 — авария на Чернобыльской АЭС, одна из крупнейших техногенных катастроф в истории человечества.

1994 — американские учёные из Национальной лаборатории им. Ферми представили доказательства того, что ими обнаружен последний, шестой кварк (Top или t-кварк), поиск которого вёлся в течение 20 лет.

1999 — компьютерный вирус «Чернобыль» поразил, по разным оценкам, до полумиллиона компьютеров по всему миру.


#Biography #Birth_Date #Events #26апреля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
А я сегодня не программировал)) почти…

Отдыхал с семьей в парке, ловил первое теплое, сибирское солнце 😎

Вот вам белочку, которая пришла сама 🐿️ для настроения🤝
🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
Ребят, у меня к вам вопрос - что еще реализовать на нашем сайте devforge.ru, чтобы Вам хотелось постоянно им пользоваться?

Общение? Обучающий курс? Кладовка с мемами?

Пишите, не стесняйтесь, давайте обсудим?
👍4
История технологии сегодня — 27 апреля

ℹ️ Кто родился в этот день

Сэ́мюэл Фи́нли Бриз Мо́рзе (англ. Samuel Finley Breese Morse [mɔːrs]; 27 апреля 1791, Чарльзтаун в штате Массачусетс — 2 апреля 1872, Нью-Йорк)американский изобретатель и художник. Наиболее известные изобретения — электромагнитный пишущий телеграф («аппарат Морзе», 1836) и код (азбука) Морзе.

Филип Хауге Абельсон (27 апреля 1913 — 1 августа 2004)американский физик , научный редактор и научный писатель . Получив образование в области ядерной физики , он стал одним из первооткрывателей элемента нептуния , работал над разделением изотопов в рамках Манхэттенского проекта и написал первое исследование ядерных морских двигателей для подводных лодок.

Фрэнк Уильям Абагнейл-младший ( / ˈ æ b ə ɡ n eɪ l / ; родился 27 апреля 1948 г.) американо-французский консультант по безопасности, писатель и осужденный преступник, чьи задокументированные преступления в основном заключаются в мошенничестве с чеками и мелком воровстве, направленном против частных лиц и малых предприятий.
Начиная с конца 1970-х годов, Абагнейл утверждал, что его криминальное прошлое было гораздо более драматичным, включая длительные выдачи себя за пилота Pan American World Airways, врача больницы в Джорджии и помощника генерального прокурора Луизианы, среди прочих ролей. Эти утверждения легли в основу его автобиографии 1980 года «Поймай меня, если сможешь», написанной в соавторстве со Стэном Реддингом. Книга вдохновила на создание одноименного фильма, снятого Стивеном Спилбергом в 2002 году, в котором Абагнейла сыграл Леонардо Ди Каприо.

//Мне просто фильм нравится)

🌐 Знаковые события

2005 — первый полёт совершил авиалайнер Airbus А380.


#Biography #Birth_Date #Events #27апреля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4